From 113cd73922b9b67c261c19c744e46eb2822d7b41 Mon Sep 17 00:00:00 2001
From: zouyu <2723363702@qq.com>
Date: 星期五, 14 十一月 2025 14:54:11 +0800
Subject: [PATCH] Merge branch 'prod' into dev_tide

---
 src/main/java/com/ruoyi/warehouse/pojo/Warehouse.java                                                          |   62 
 src/main/resources/application-jsmy.yml                                                                        |  219 
 src/main/java/com/ruoyi/sales/service/ShippingInfoService.java                                                 |   14 
 src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskJob.java                                         |  259 
 src/main/java/com/ruoyi/sales/controller/SalespersonManagementController.java                                  |   65 
 src/main/java/com/ruoyi/sales/dto/ReceiptPaymentRecordDto.java                                                 |   61 
 src/main/java/com/ruoyi/collaborativeApproval/service/impl/MeetingServiceImpl.java                             |  244 
 src/main/java/com/ruoyi/common/utils/OrderUtils.java                                                           |   55 
 src/main/resources/mapper/approve/FileSharingMapper.xml                                                        |    7 
 src/main/java/com/ruoyi/approve/service/impl/NotificationManagementServiceImpl.java                            |   24 
 src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java                                       |   27 
 src/main/java/com/ruoyi/staff/pojo/StaffScheduling.java                                                        |  106 
 src/main/resources/mapper/sales/InvoiceLedgerMapper.xml                                                        |    2 
 src/main/java/com/ruoyi/device/controller/DeviceDefectRecordController.java                                    |   51 
 src/main/java/com/ruoyi/warehouse/dto/DocumentationReturnManagementDto.java                                    |   12 
 src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java                                  |   10 
 src/main/resources/mapper/approve/RpaProcessAutomationMapper.xml                                               |   19 
 src/main/resources/application-jsyny.yml                                                                       |  219 
 src/main/java/com/ruoyi/collaborativeApproval/dto/MeetUseDto.java                                              |   21 
 src/main/java/com/ruoyi/production/dto/DaiDto.java                                                             |  110 
 src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java                                         |   54 
 src/main/java/com/ruoyi/collaborativeApproval/service/DutyPlanService.java                                     |   19 
 src/main/java/com/ruoyi/inspectiontask/controller/InspectionTaskController.java                                |   77 
 src/main/java/com/ruoyi/approve/utils/StartAndEndDateDto.java                                                  |   16 
 src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnManagementServiceImpl.java                        |   29 
 src/main/java/com/ruoyi/inspectiontask/mapper/TimingTaskMapper.java                                            |   17 
 src/main/java/com/ruoyi/account/controller/AccountExpenseController.java                                       |   22 
 src/main/java/com/ruoyi/device/pojo/DeviceDefectRecord.java                                                    |   51 
 src/main/resources/mapper/warehouse/WarehouseGoodsShelvesMapper.xml                                            |   50 
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPlanController.java                            |   67 
 src/main/resources/mapper/oA/OaProjectPhaseTaskMapper.xml                                                      |   34 
 src/main/java/com/ruoyi/sales/mapper/SalesQuotationMapper.java                                                 |   14 
 src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java                             |  257 
 src/main/java/com/ruoyi/collaborativeApproval/service/impl/SealApplicationManagementServiceImpl.java           |   22 
 src/main/resources/application-hxgy.yml                                                                        |  219 
 src/main/java/com/ruoyi/sales/service/impl/SalesQuotationProductServiceImpl.java                               |   11 
 src/main/java/com/ruoyi/warehouse/pojo/DocumentationBorrowManagement.java                                      |  129 
 pom.xml                                                                                                        |    6 
 src/main/java/com/ruoyi/device/execl/DeviceMaintenanceExeclDto.java                                            |    8 
 src/main/resources/mapper/collaborativeApproval/RulesRegulationsManagementMapper.xml                           |   31 
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java                          |   10 
 src/main/resources/application-hysn.yml                                                                        |  219 
 src/main/resources/mapper/inspectiontask/TimingTaskMapper.xml                                                  |    8 
 src/main/resources/mapper/sales/SalesQuotationProductMapper.xml                                                |   15 
 src/main/java/com/ruoyi/sales/controller/PaymentShippingController.java                                        |   70 
 src/main/resources/mapper/staff/HolidayApplicationMapper.xml                                                   |    7 
 src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java                                      |   96 
 src/main/java/com/ruoyi/collaborativeApproval/mapper/SealApplicationManagementMapper.java                      |   14 
 src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java                                           |   95 
 src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java                                    |   58 
 src/main/java/com/ruoyi/approve/mapper/AnnualLeaveSettingMapper.java                                           |   13 
 src/main/java/com/ruoyi/warehouse/controller/WarehouseController.java                                          |   63 
 src/main/java/com/ruoyi/collaborativeApproval/pojo/MeetingRoom.java                                            |   98 
 src/main/java/com/ruoyi/equipmentenergyconsumption/mapper/ElectricityConsumptionAreaMapper.java                |   15 
 src/main/java/com/ruoyi/equipmentenergyconsumption/controller/ElectricityConsumptionAreaController.java        |   66 
 src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java                                            |   16 
 src/main/resources/mapper/sales/ShippingInfoMapper.xml                                                         |   44 
 src/main/java/com/ruoyi/sales/dto/ReceiptPaymentDto.java                                                       |   19 
 src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java                                                           |   68 
 src/main/resources/mapper/collaborativeApproval/DutyPlanMapper.xml                                             |   40 
 src/main/java/com/ruoyi/production/controller/SalesLedgerWorkController.java                                   |   21 
 src/main/java/com/ruoyi/warehouse/service/DocumentationFileService.java                                        |   14 
 src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/MeasuringInstrumentLedgerRecordServiceImpl.java |   15 
 src/main/resources/mapper/system/SysUserMapper.xml                                                             |   22 
 src/main/java/com/ruoyi/inspectiontask/controller/TimingTaskController.java                                    |   74 
 src/main/java/com/ruoyi/sales/service/impl/ReceiptPaymentServiceImpl.java                                      |    9 
 src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java                          |   31 
 src/main/java/com/ruoyi/oA/service/OaProjectPhaseService.java                                                  |   21 
 src/main/java/com/ruoyi/staff/service/StaffSchedulingService.java                                              |   20 
 src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java                                          |   13 
 src/main/java/com/ruoyi/warehouse/service/impl/DocumentationServiceImpl.java                                   |  116 
 src/main/java/com/ruoyi/approve/controller/KnowledgeBaseController.java                                        |   72 
 src/main/java/com/ruoyi/equipmentenergyconsumption/mapper/EnergyPeriodMapper.java                              |   12 
 src/main/java/com/ruoyi/collaborativeApproval/service/NoticeService.java                                       |   17 
 src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java                                   |  239 
 src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java                                        |   30 
 src/main/java/com/ruoyi/common/utils/excel/ConfigurableMergeStrategy.java                                      |   29 
 src/main/resources/mapper/device/DeviceLedgerMapper.xml                                                        |   14 
 src/main/java/com/ruoyi/common/utils/excel/ExcelClassField.java                                                |   77 
 src/main/java/com/ruoyi/device/mapper/DeviceMaintenanceMapper.java                                             |    6 
 src/main/resources/application-tjxm.yml                                                                        |  219 
 src/main/resources/mapper/approve/AnnualLeaveSettingMapper.xml                                                 |   15 
 src/main/java/com/ruoyi/basic/service/StorageBlobService.java                                                  |    3 
 src/main/java/com/ruoyi/device/mapper/DeviceLedgerMapper.java                                                  |    4 
 src/main/java/com/ruoyi/approve/vo/ApproveGetAndUpdateVo.java                                                  |    8 
 src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/MeasuringInstrumentLedgerServiceImpl.java       |   15 
 src/main/resources/mybatis/mybatis-config.xml                                                                  |    1 
 src/main/resources/mapper/equipmentenergyconsumption/electricityConsumptionAreaMapper.xml                      |   27 
 src/main/java/com/ruoyi/common/enums/FileNameType.java                                                         |    5 
 src/main/java/com/ruoyi/procurementrecord/mapper/ReturnManagementMapper.java                                   |   22 
 src/main/resources/mapper/approve/OvertimeSettingMapper.xml                                                    |   18 
 src/main/java/com/ruoyi/sales/service/impl/CommonFileServiceImpl.java                                          |   15 
 src/main/resources/mapper/approve/WorkingHoursSettingMapper.xml                                                |   15 
 src/main/java/com/ruoyi/inspectiontask/dto/QrCodeScanRecordDto.java                                            |   20 
 src/main/java/com/ruoyi/basic/service/StorageAttachmentService.java                                            |    3 
 src/main/java/com/ruoyi/device/service/impl/DeviceDefectRecordServiceImpl.java                                 |   67 
 src/main/java/com/ruoyi/account/service/AccountIncomeService.java                                              |    4 
 src/main/java/com/ruoyi/approve/mapper/KnowledgeBaseMapper.java                                                |   13 
 src/main/resources/mapper/warehouse/DocumentationBorrowManagementMapper.xml                                    |   88 
 src/main/resources/application-tymk.yml                                                                        |  219 
 src/main/java/com/ruoyi/inspectiontask/service/QrCodeScanRecordService.java                                    |   20 
 src/main/java/com/ruoyi/dto/PageDto.java                                                                       |   18 
 src/main/resources/static/report-template.docx                                                                 |    0 
 src/main/java/com/ruoyi/officesupplies/mapper/OfficeSuppliesMapper.java                                        |   23 
 src/main/resources/application-phmk.yml                                                                        |  219 
 src/main/java/com/ruoyi/framework/config/SwaggerConfig.java                                                    |    4 
 src/main/java/com/ruoyi/purchase/pojo/PaymentRegistration.java                                                 |    5 
 src/main/java/com/ruoyi/inspectiontask/service/impl/SpringContextHolder.java                                   |   20 
 src/main/resources/mapper/collaborativeApproval/SealApplicationManagementMapper.xml                            |   21 
 src/main/resources/application-hsxny.yml                                                                       |  219 
 src/main/java/com/ruoyi/warehouse/dto/WarehouseTreeDto.java                                                    |   12 
 src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml                                     |    7 
 src/main/java/com/ruoyi/officesupplies/service/impl/OfficeSuppliesServiceImpl.java                             |   30 
 src/main/java/com/ruoyi/approve/mapper/OvertimeSettingMapper.java                                              |   13 
 src/main/resources/application-mxsc.yml                                                                        |  219 
 src/main/resources/application-bdsm.yml                                                                        |  219 
 src/main/java/com/ruoyi/oA/dto/OaProjectPhaseDto.java                                                          |   12 
 src/main/java/com/ruoyi/device/pojo/DeviceLedger.java                                                          |   23 
 src/main/java/com/ruoyi/oA/controller/OaProjectPhaseController.java                                            |   41 
 src/main/java/com/ruoyi/sales/service/impl/SalespersonManagementServiceImpl.java                               |   37 
 src/main/java/com/ruoyi/purchase/dto/InvoicePurchaseReportDto.java                                             |    9 
 src/main/java/com/ruoyi/common/utils/excel/ExcelUtils.java                                                     | 1039 ++
 src/main/java/com/ruoyi/device/dto/DeviceDefectRecordDto.java                                                  |   14 
 src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java                                                    |   20 
 src/main/java/com/ruoyi/inspectiontask/mapper/QrCodeMapper.java                                                |   11 
 src/main/java/com/ruoyi/lavorissue/pojo/LaborIssue.java                                                        |  172 
 src/main/java/com/ruoyi/account/controller/AccountIncomeController.java                                        |    9 
 src/main/java/com/ruoyi/basic/pojo/SupplierManage.java                                                         |   12 
 src/main/java/com/ruoyi/basic/pojo/StorageAttachment.java                                                      |    4 
 src/main/resources/application-hbxm.yml                                                                        |  219 
 src/main/java/com/ruoyi/collaborativeApproval/dto/NoticeDTO.java                                               |   13 
 src/main/java/com/ruoyi/staff/service/PersonalAttendanceRecordsService.java                                    |   10 
 src/main/java/com/ruoyi/oA/pojo/OaProjectPhase.java                                                            |   92 
 src/main/java/com/ruoyi/basic/dto/StorageBlobDTO.java                                                          |    2 
 src/main/java/com/ruoyi/warehouse/service/impl/DocumentationBorrowManagementServiceImpl.java                   |  168 
 src/main/java/com/ruoyi/home/service/HomeService.java                                                          |    3 
 src/main/java/com/ruoyi/warehouse/service/DocumentationBorrowManagementService.java                            |   38 
 src/main/resources/application-nydl.yml                                                                        |  219 
 src/main/java/com/ruoyi/approve/mapper/FileSharingMapper.java                                                  |    9 
 src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java                                       |    6 
 src/main/java/com/ruoyi/approve/pojo/RpaProcessAutomation.java                                                 |   65 
 src/main/java/com/ruoyi/inspectiontask/dto/InspectionTaskDto.java                                              |   20 
 src/main/java/com/ruoyi/compensationperformance/pojo/CompensationPerformance.java                              |    1 
 src/main/java/com/ruoyi/oA/service/OaProjectPhaseTaskService.java                                              |   17 
 src/main/java/com/ruoyi/procurementrecord/service/impl/InboundManagementServiceImpl.java                       |   29 
 src/main/java/com/ruoyi/approve/utils/ListToStringTypeHandler.java                                             |   52 
 src/main/resources/mapper/procurementrecord/GasTankWarningMapper.xml                                           |   23 
 src/main/java/com/ruoyi/collaborativeApproval/pojo/StaffContactsPersonal.java                                  |   43 
 src/main/java/com/ruoyi/equipmentenergyconsumption/controller/EnergyPeriodController.java                      |   84 
 src/main/java/com/ruoyi/oA/controller/OaProjectPhaseTaskController.java                                        |   41 
 src/main/java/com/ruoyi/sales/service/SalesQuotationProductService.java                                        |    8 
 src/main/java/com/ruoyi/common/utils/excel/CustomCellStyleHandler.java                                         |   43 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java                                          |   38 
 src/main/java/com/ruoyi/warehouse/dto/DocumentClassificationTreeDto.java                                       |   13 
 src/main/java/com/ruoyi/staff/dto/SaveStaffSchedulingDto.java                                                  |   49 
 src/main/java/com/ruoyi/project/common/CommonController.java                                                   |   20 
 src/main/java/com/ruoyi/device/controller/DeviceRepairController.java                                          |    3 
 src/main/resources/application-zqhx.yml                                                                        |   12 
 src/main/resources/application-zyrqCopy.yml                                                                    |  219 
 src/main/java/com/ruoyi/sales/mapper/SalesQuotationProductMapper.java                                          |   16 
 src/main/java/com/ruoyi/common/utils/excel/ExcelImport.java                                                    |   31 
 src/main/java/com/ruoyi/collaborativeApproval/mapper/MeetDraftMapper.java                                      |   18 
 src/main/resources/mapper/warehouse/DocumentationMapper.xml                                                    |   87 
 src/main/java/com/ruoyi/approve/mapper/WorkingHoursSettingMapper.java                                          |   13 
 src/main/resources/application-zyrq.yml                                                                        |  219 
 src/main/java/com/ruoyi/collaborativeApproval/pojo/MeetDraft.java                                              |  132 
 src/main/java/com/ruoyi/warehouse/mapper/WarehouseGoodsShelvesMapper.java                                      |   29 
 src/main/java/com/ruoyi/warehouse/service/impl/WarehouseGoodsShelvesServiceImpl.java                           |  179 
 src/main/java/com/ruoyi/collaborativeApproval/service/MeetingService.java                                      |   73 
 src/main/java/com/ruoyi/collaborativeApproval/dto/StaffContactsPersonalDTO.java                                |   17 
 src/main/java/com/ruoyi/customervisits/mapper/CustomerVisitsMapper.java                                        |   11 
 src/main/java/com/ruoyi/warehouse/pojo/Documentation.java                                                      |  175 
 src/main/java/com/ruoyi/equipmentenergyconsumption/service/ElectricityConsumptionAreaService.java              |   16 
 src/main/java/com/ruoyi/inspectiontask/controller/QrCodeController.java                                        |   56 
 src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementPriceManagementMapper.java                         |   23 
 src/main/java/com/ruoyi/waterrecord/mapper/WaterRecordMapper.java                                              |   21 
 src/main/java/com/ruoyi/collaborativeApproval/vo/SearchMeetingApplicationVo.java                               |   16 
 src/main/java/com/ruoyi/staff/vo/SearchSchedulingVo.java                                                       |   27 
 src/main/resources/mapper/customervisits/CustomerVisitsMapper.xml                                              |    5 
 src/main/java/com/ruoyi/approve/service/impl/RpaProcessAutomationServiceImpl.java                              |   21 
 src/main/java/com/ruoyi/officesupplies/pojo/OfficeSupplies.java                                                |  160 
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPriceManagementServiceImpl.java              |   78 
 src/main/java/com/ruoyi/sales/service/PaymentShippingService.java                                              |   22 
 src/main/java/com/ruoyi/oA/mapper/OaProjectPhaseMapper.java                                                    |   18 
 src/main/java/com/ruoyi/warehouse/controller/DocumentationBorrowManagementController.java                      |  113 
 src/main/java/com/ruoyi/sales/service/SalesQuotationService.java                                               |   17 
 src/main/java/com/ruoyi/procurementrecord/dto/Details.java                                                     |   16 
 src/main/resources/mapper/collaborativeApproval/MeetingRoomMapper.xml                                          |   28 
 src/main/java/com/ruoyi/basic/service/impl/StorageAttachmentServiceImpl.java                                   |   16 
 src/main/java/com/ruoyi/collaborativeApproval/mapper/ReadingStatusMapper.java                                  |    9 
 src/main/java/com/ruoyi/warehouse/dto/DocumentationBorrowManagementDto.java                                    |   16 
 src/main/java/com/ruoyi/inspectiontask/dto/QrCodeDto.java                                                      |    8 
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java                                   |   50 
 src/main/java/com/ruoyi/collaborativeApproval/service/RulesRegulationsManagementService.java                   |   11 
 src/main/java/com/ruoyi/staff/service/HolidayApplicationService.java                                           |   10 
 src/main/java/com/ruoyi/officesupplies/controller/OfficeSuppliesController.java                                |   87 
 src/main/java/com/ruoyi/approve/pojo/OvertimeSetting.java                                                      |   79 
 src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java                                          |   30 
 src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java                                               |    7 
 src/main/java/com/ruoyi/warehouse/service/DocumentClassificationService.java                                   |   20 
 src/main/java/com/ruoyi/warehouse/mapper/DocumentationBorrowManagementMapper.java                              |   35 
 src/main/java/com/ruoyi/basic/controller/SupplierManageController.java                                         |    9 
 src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementController.java             |   87 
 src/main/java/com/ruoyi/warehouse/service/impl/DocumentClassificationServiceImpl.java                          |   97 
 src/main/java/com/ruoyi/basic/mapper/StorageAttachmentMapper.java                                              |    2 
 src/main/java/com/ruoyi/collaborativeApproval/service/impl/DutyPlanServiceImpl.java                            |   41 
 src/main/java/com/ruoyi/collaborativeApproval/pojo/DutyPlan.java                                               |  125 
 src/main/java/com/ruoyi/customervisits/service/impl/CustomerVisitsServiceImpl.java                             |   35 
 src/main/java/com/ruoyi/collaborativeApproval/controller/DutyPlanController.java                               |   63 
 src/main/java/com/ruoyi/warehouse/controller/DocumentClassificationController.java                             |   52 
 src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java                                       |    2 
 src/main/resources/mapper/sales/PaymentShippingMapper.xml                                                      |   19 
 src/main/resources/application-hcmy.yml                                                                        |  219 
 src/main/java/com/ruoyi/device/dto/DeviceLedgerDto.java                                                        |   23 
 src/main/java/com/ruoyi/sales/mapper/ShippingInfoMapper.java                                                   |   19 
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java                    |   13 
 src/main/java/com/ruoyi/device/execl/DeviceRepairExeclDto.java                                                 |    8 
 src/main/java/com/ruoyi/lavorissue/service/impl/LavorIssueServiceImpl.java                                     |  365 
 src/main/java/com/ruoyi/account/service/impl/AccountIncomeServiceImpl.java                                     |   14 
 src/main/java/com/ruoyi/staff/service/impl/HolidayApplicationServiceImpl.java                                  |   22 
 src/main/java/com/ruoyi/warehouse/pojo/DocumentationFile.java                                                  |   60 
 src/main/resources/mapper/staff/StaffJoinLeaveRecordMapper.xml                                                 |    1 
 src/main/java/com/ruoyi/account/service/AccountExpenseService.java                                             |    8 
 src/main/java/com/ruoyi/sales/pojo/SalesQuotation.java                                                         |   69 
 src/main/java/com/ruoyi/inspectiontask/mapper/QrCodeScanRecordMapper.java                                      |   11 
 src/main/java/com/ruoyi/home/controller/HomeController.java                                                    |    3 
 src/main/resources/application-cjny.yml                                                                        |  219 
 src/main/java/com/ruoyi/warehouse/controller/WarehouseGoodsShelvesController.java                              |   54 
 src/main/java/com/ruoyi/inspectiontask/service/impl/QrCodeServiceImpl.java                                     |   54 
 src/main/java/com/ruoyi/warehouse/service/DocumentationService.java                                            |   40 
 src/main/resources/application-jyhj.yml                                                                        |  219 
 src/main/java/com/ruoyi/inspectiontask/controller/QrCodeScanRecordController.java                              |   56 
 src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java                                            |   61 
 src/main/java/com/ruoyi/production/controller/SalesLedgerSchedulingController.java                             |   29 
 src/main/java/com/ruoyi/warehouse/controller/WarehouseGoodsShelvesRowcolController.java                        |   32 
 src/main/resources/mapper/waterrecord/WaterRecordMapper.xml                                                    |   17 
 src/main/java/com/ruoyi/approve/controller/HolidaySettingsController.java                                      |  173 
 src/main/java/com/ruoyi/device/service/DeviceDefectRecordService.java                                          |   15 
 src/main/java/com/ruoyi/purchase/controller/AccountingReportController.java                                    |   26 
 src/main/java/com/ruoyi/oA/dto/OaProjectDto.java                                                               |   26 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java                                 |    7 
 src/main/java/com/ruoyi/sales/dto/SalesQuotationDto.java                                                       |   14 
 src/main/java/com/ruoyi/inspectiontask/service/impl/QuartzConfig.java                                          |   50 
 src/main/java/com/ruoyi/production/service/SalesLedgerSchedulingService.java                                   |    2 
 src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java                                                       |   17 
 src/main/java/com/ruoyi/inspectiontask/dto/TimingTaskDto.java                                                  |   12 
 src/main/java/com/ruoyi/procurementrecord/mapper/InboundManagementMapper.java                                  |   23 
 src/main/java/com/ruoyi/warehouse/controller/DocumentationController.java                                      |   91 
 src/main/java/com/ruoyi/purchase/dto/PaymentRegistrationDto.java                                               |    3 
 src/main/java/com/ruoyi/warehouse/service/WarehouseService.java                                                |   24 
 src/main/resources/mapper/approve/KnowledgeBaseMapper.xml                                                      |   21 
 src/main/java/com/ruoyi/approve/service/RpaProcessAutomationService.java                                       |   10 
 src/main/java/com/ruoyi/oA/mapper/OaProjectMapper.java                                                         |   27 
 src/main/resources/application-mqsp.yml                                                                        |  219 
 src/main/java/com/ruoyi/common/enums/StorageAttachmentRecordType.java                                          |    5 
 src/main/java/com/ruoyi/sales/pojo/PaymentShipping.java                                                        |   83 
 src/main/resources/mapper/warehouse/WarehouseGoodsShelvesRowcolMapper.xml                                      |   41 
 src/main/java/com/ruoyi/production/dto/SalesLedgerWorkDto.java                                                 |   17 
 src/main/java/com/ruoyi/sales/mapper/PaymentShippingMapper.java                                                |   23 
 src/main/java/com/ruoyi/equipmentenergyconsumption/pojo/EnergyPeriod.java                                      |   59 
 src/main/resources/application-hckx.yml                                                                        |  219 
 src/main/resources/application-hxsj.yml                                                                        |  219 
 src/main/resources/application-dhdc.yml                                                                        |  219 
 src/main/java/com/ruoyi/warehouse/mapper/WarehouseMapper.java                                                  |   26 
 src/main/resources/application-hsmy.yml                                                                        |  219 
 src/main/resources/mapper/sales/ReceiptPaymentMapper.xml                                                       |   23 
 src/main/resources/mapper/warehouse/DocumentClassificationMapper.xml                                           |   23 
 src/main/java/com/ruoyi/warehouse/mapper/DocumentationFileMapper.java                                          |   17 
 src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml                                       |   13 
 src/main/java/com/ruoyi/equipmentenergyconsumption/pojo/ElectricityConsumptionArea.java                        |   43 
 src/main/java/com/ruoyi/account/controller/AccountFileController.java                                          |    6 
 src/main/resources/application-xyhb.yml                                                                        |  219 
 src/main/java/com/ruoyi/collaborativeApproval/pojo/RulesRegulationsManagement.java                             |  111 
 src/main/java/com/ruoyi/warehouse/mapper/DocumentClassificationMapper.java                                     |   20 
 src/main/java/com/ruoyi/inspectiontask/StorageAttachmentRecordType.java                                        |   23 
 src/main/java/com/ruoyi/measuringinstrumentledger/service/SparePartsService.java                               |   16 
 src/main/java/com/ruoyi/procurementrecord/service/ReturnManagementService.java                                 |   22 
 src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml                                         |   16 
 src/main/java/com/ruoyi/approve/mapper/HolidaySettingsMapper.java                                              |   13 
 src/main/java/com/ruoyi/collaborativeApproval/pojo/ReadingStatus.java                                          |   70 
 src/main/resources/application-zjyj.yml                                                                        |   12 
 src/main/resources/mapper/warehouse/WarehouseMapper.xml                                                        |   42 
 src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java                                 |  450 
 src/main/java/com/ruoyi/measuringinstrumentledger/dto/SparePartsDto.java                                       |   15 
 src/main/java/com/ruoyi/warehouse/service/impl/WarehouseServiceImpl.java                                       |  175 
 src/main/java/com/ruoyi/collaborativeApproval/vo/SearchMeetingRoomVo.java                                      |   23 
 src/main/resources/application-cmny.yml                                                                        |  219 
 src/main/java/com/ruoyi/approve/pojo/AnnualLeaveSetting.java                                                   |   70 
 src/main/java/com/ruoyi/warehouse/dto/WarehouseGoodsShelvesRowcolDto.java                                      |   15 
 src/main/java/com/ruoyi/approve/controller/NotificationManagementController.java                               |   82 
 src/main/java/com/ruoyi/approve/service/impl/KnowledgeBaseServiceImpl.java                                     |   21 
 src/main/java/com/ruoyi/collaborativeApproval/pojo/MeetingMinutes.java                                         |   79 
 src/main/java/com/ruoyi/sales/service/impl/PaymentShippingServiceImpl.java                                     |   29 
 src/main/java/com/ruoyi/oA/service/OaProjectService.java                                                       |   24 
 src/main/resources/mapper/sales/SalespersonManagementMapper.xml                                                |   19 
 src/main/java/com/ruoyi/approve/mapper/RpaProcessAutomationMapper.java                                         |   16 
 src/main/resources/mapper/sales/SalesQuotationMapper.xml                                                       |   19 
 src/main/resources/mapper/collaborativeApproval/NoticeMapper.xml                                               |   21 
 src/main/java/com/ruoyi/collaborativeApproval/service/StaffContactsPersonalService.java                        |   11 
 src/main/java/com/ruoyi/collaborativeApproval/mapper/StaffContactsPersonalMapper.java                          |   14 
 src/main/java/com/ruoyi/lavorissue/dto/StatisticsLaborIssue.java                                               |   30 
 src/main/java/com/ruoyi/equipmentenergyconsumption/dto/EquipmentEnergyConsumptionDto.java                      |  111 
 src/main/java/com/ruoyi/collaborativeApproval/controller/SealApplicationManagementController.java              |   63 
 src/main/java/com/ruoyi/warehouse/service/WarehouseGoodsShelvesService.java                                    |   27 
 src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseTaskServiceImpl.java                                     |   33 
 src/main/java/com/ruoyi/procurementrecord/controller/GasTankWarningController.java                             |   44 
 src/main/resources/application-bhmy.yml                                                                        |  219 
 src/main/java/com/ruoyi/procurementrecord/mapper/GasTankWarningMapper.java                                     |   13 
 src/main/java/com/ruoyi/lavorissue/controller/LavorIssueController.java                                        |  150 
 src/main/java/com/ruoyi/warehouse/dto/ReturnExportDto.java                                                     |   27 
 src/main/java/com/ruoyi/collaborativeApproval/controller/StaffContactsPersonalController.java                  |   42 
 src/main/java/com/ruoyi/oA/pojo/OaProject.java                                                                 |  107 
 src/main/java/com/ruoyi/procurementrecord/pojo/GasTankWarning.java                                             |  158 
 src/main/resources/mapper/approve/ApproveProcessMapper.xml                                                     |    3 
 src/main/java/com/ruoyi/collaborativeApproval/pojo/SealApplicationManagement.java                              |   72 
 src/main/java/com/ruoyi/quality/controller/QualityInspectController.java                                       |   12 
 src/main/java/com/ruoyi/aftersalesservice/dto/AfterSalesServiceDto.java                                        |   68 
 src/main/java/com/ruoyi/officesupplies/service/OfficeSuppliesService.java                                      |   22 
 src/main/java/com/ruoyi/collaborativeApproval/dto/MeetingItem.java                                             |   24 
 src/main/java/com/ruoyi/approve/service/HolidaySettingsService.java                                            |   10 
 src/main/java/com/ruoyi/procurementrecord/controller/ReturnManagementController.java                           |   69 
 src/main/java/com/ruoyi/device/mapper/DeviceDefectRecordMapper.java                                            |   14 
 src/main/resources/mapper/equipmentenergyconsumption/EnergyPeriodMapper.xml                                    |   30 
 src/main/java/com/ruoyi/warehouse/service/impl/DocumentationFileServiceImpl.java                               |   26 
 src/main/java/com/ruoyi/common/utils/MinioUtils.java                                                           |  132 
 src/main/java/com/ruoyi/staff/pojo/PersonalAttendanceRecords.java                                              |   52 
 src/main/java/com/ruoyi/warehouse/pojo/DocumentationReturnManagement.java                                      |  130 
 src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml                                 |    4 
 src/main/java/com/ruoyi/approve/service/IApproveProcessService.java                                            |    5 
 src/main/resources/application-hhkj.yml                                                                        |  219 
 src/main/java/com/ruoyi/collaborativeApproval/dto/DutyPlanDTO.java                                             |   22 
 src/main/java/com/ruoyi/approve/service/impl/HolidaySettingsServiceImpl.java                                   |   21 
 src/main/java/com/ruoyi/warehouse/dto/DocumentationDto.java                                                    |   20 
 src/main/java/com/ruoyi/common/utils/excel/ExcelExport.java                                                    |   28 
 src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java                                   |   10 
 src/main/java/com/ruoyi/approve/mapper/OnlineMeetingMapper.java                                                |    9 
 src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementPlan.java                                            |  105 
 src/main/java/com/ruoyi/sales/mapper/SalespersonManagementMapper.java                                          |   17 
 src/main/java/com/ruoyi/sales/pojo/SalespersonManagement.java                                                  |   79 
 src/main/java/com/ruoyi/collaborativeApproval/mapper/NoticeMapper.java                                         |   20 
 src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseServiceImpl.java                                         |   62 
 src/main/java/com/ruoyi/staff/controller/StaffSchedulingController.java                                        |   67 
 src/main/java/com/ruoyi/procurementrecord/controller/InboundManagementController.java                          |   64 
 src/main/java/com/ruoyi/equipmentenergyconsumption/service/impl/EnergyPeriodServiceImpl.java                   |   24 
 src/main/java/com/ruoyi/quality/service/IQualityInspectService.java                                            |    4 
 src/main/java/com/ruoyi/collaborativeApproval/pojo/MeetApplication.java                                        |  140 
 src/main/resources/mapper/procurementrecord/InboundManagementMapper.xml                                        |   16 
 src/main/java/com/ruoyi/waterrecord/service/WaterRecordService.java                                            |   25 
 src/main/resources/mapper/collaborativeApproval/MeetApplicationMapper.xml                                      |   80 
 src/main/java/com/ruoyi/warehouse/controller/DocumentationFileController.java                                  |   64 
 src/main/java/com/ruoyi/lavorissue/mapper/LavorIssueMapper.java                                                |   27 
 src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java                               |   19 
 src/main/java/com/ruoyi/procurementrecord/service/impl/GasTankWarningServiceImpl.java                          |   40 
 src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java                                |    3 
 src/main/java/com/ruoyi/compensationperformance/controller/CompensationPerformanceController.java              |   11 
 src/main/java/com/ruoyi/aftersalesservice/pojo/AfterSalesService.java                                          |   12 
 src/main/resources/mapper/warehouse/DocumentationFileMapper.xml                                                |   17 
 src/main/java/com/ruoyi/staff/mapper/PersonalAttendanceRecordsMapper.java                                      |    9 
 src/main/resources/mapper/device/DeviceMaintenanceMapper.xml                                                   |   35 
 src/main/java/com/ruoyi/approve/pojo/OnlineMeeting.java                                                        |   80 
 src/main/java/com/ruoyi/sales/pojo/SalesLedger.java                                                            |   14 
 src/main/resources/mapper/approve/NotificationManagementMapper.xml                                             |   19 
 src/main/java/com/ruoyi/collaborativeApproval/service/impl/RulesRegulationsManagementServiceImpl.java          |   21 
 src/main/java/com/ruoyi/procurementrecord/service/InboundManagementService.java                                |   22 
 src/main/java/com/ruoyi/oA/pojo/OaProjectPhaseTask.java                                                        |  117 
 src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementPriceManagement.java                                 |  122 
 src/main/java/com/ruoyi/collaborativeApproval/mapper/MeetApplicationMapper.java                                |   26 
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java                                         |   44 
 src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java                                      |   14 
 src/main/java/com/ruoyi/warehouse/service/impl/WarehouseGoodsShelvesRowcolServiceImpl.java                     |   63 
 src/main/java/com/ruoyi/purchase/dto/VatDto.java                                                               |    5 
 src/main/java/com/ruoyi/warehouse/pojo/WarehouseGoodsShelvesRowcol.java                                        |   79 
 src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesServiceController.java                          |   38 
 src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java                                                       |    9 
 src/main/java/com/ruoyi/equipmentenergyconsumption/controller/EquipmentEnergyConsumptionController.java        |   36 
 src/main/java/com/ruoyi/purchase/controller/PaymentRegistrationController.java                                 |   21 
 src/main/resources/mapper/procurementrecord/ProcurementPlanMapper.xml                                          |   16 
 src/main/java/com/ruoyi/staff/pojo/StaffOnJob.java                                                             |    2 
 src/main/java/com/ruoyi/approve/pojo/WorkingHoursSetting.java                                                  |   79 
 src/main/java/com/ruoyi/basic/controller/CustomerController.java                                               |    7 
 src/main/java/com/ruoyi/procurementrecord/service/ProcurementPlanService.java                                  |   25 
 src/main/java/com/ruoyi/staff/service/impl/StaffSchedulingServiceImpl.java                                     |   61 
 src/main/java/com/ruoyi/warehouse/service/WarehouseGoodsShelvesRowcolService.java                              |   23 
 src/main/java/com/ruoyi/approve/pojo/KnowledgeBase.java                                                        |   86 
 src/main/java/com/ruoyi/collaborativeApproval/vo/SearchMeetingUseVo.java                                       |   19 
 src/main/java/com/ruoyi/measuringinstrumentledger/mapper/SparePartsMapper.java                                 |   14 
 src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingDto.java                                           |    3 
 src/main/resources/application-prod.yml                                                                        |    1 
 src/main/resources/application-wdsy.yml                                                                        |   12 
 src/main/java/com/ruoyi/collaborativeApproval/vo/SearchMeetingDraftVo.java                                     |   23 
 src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java                                                 |   54 
 src/main/java/com/ruoyi/purchase/dto/ProductRecordDto.java                                                     |    1 
 src/main/java/com/ruoyi/staff/mapper/StaffSchedulingMapper.java                                                |   23 
 src/main/resources/application-jlsn.yml                                                                        |  219 
 src/main/java/com/ruoyi/approve/pojo/FileSharing.java                                                          |   69 
 src/main/java/com/ruoyi/inspectiontask/service/impl/QrCodeScanRecordServiceImpl.java                           |  194 
 src/main/java/com/ruoyi/approve/pojo/HolidaySettings.java                                                      |   80 
 src/main/java/com/ruoyi/warehouse/dto/DocumentClassificationDto.java                                           |   12 
 src/main/java/com/ruoyi/equipmentenergyconsumption/service/impl/ElectricityConsumptionAreaServiceImpl.java     |   80 
 src/main/java/com/ruoyi/collaborativeApproval/controller/MeetingController.java                                |  148 
 src/main/java/com/ruoyi/sales/pojo/SalesQuotationProduct.java                                                  |   49 
 src/main/java/com/ruoyi/basic/service/impl/StorageBlobServiceImpl.java                                         |   91 
 src/main/java/com/ruoyi/collaborativeApproval/service/impl/StaffContactsPersonalServiceImpl.java               |   22 
 src/main/java/com/ruoyi/inspectiontask/service/QrCodeService.java                                              |   19 
 src/main/java/com/ruoyi/collaborativeApproval/pojo/Notice.java                                                 |   88 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java                                      |   44 
 src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java                                                  |    3 
 src/main/java/com/ruoyi/purchase/controller/TicketRegistrationController.java                                  |   12 
 src/main/java/com/ruoyi/sales/controller/ReceiptPaymentController.java                                         |   27 
 src/main/java/com/ruoyi/collaborativeApproval/controller/NoticeController.java                                 |   63 
 src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml                                        |   40 
 src/main/java/com/ruoyi/inspectiontask/pojo/QrCode.java                                                        |   63 
 src/main/resources/mapper/procurementrecord/ProcurementPriceManagementMapper.xml                               |   16 
 src/main/java/com/ruoyi/approve/service/NotificationManagementService.java                                     |   10 
 src/main/java/com/ruoyi/inspectiontask/pojo/TimingTask.java                                                    |  108 
 src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java                                                     |    8 
 src/main/resources/mapper/officesupplies/OfficeSuppliesMapper.xml                                              |   19 
 src/main/java/com/ruoyi/purchase/pojo/TicketRegistration.java                                                  |    9 
 src/main/resources/application-rzny.yml                                                                        |  219 
 src/main/java/com/ruoyi/inspectiontask/pojo/QrCodeScanRecord.java                                              |   73 
 src/main/java/com/ruoyi/procurementrecord/pojo/InboundManagement.java                                          |   73 
 src/main/java/com/ruoyi/approve/pojo/NotificationManagement.java                                               |   88 
 src/main/java/com/ruoyi/staff/controller/HolidayApplicationController.java                                     |   44 
 src/main/java/com/ruoyi/inspectiontask/pojo/InspectionTask.java                                                |   92 
 src/main/java/com/ruoyi/warehouse/mapper/DocumentationMapper.java                                              |   48 
 src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsController.java                         |   62 
 src/main/java/com/ruoyi/sales/service/SalespersonManagementService.java                                        |   22 
 src/main/java/com/ruoyi/account/service/impl/AccountExpenseServiceImpl.java                                    |   56 
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java                       |  113 
 src/main/resources/mapper/approve/OnlineMeetingMapper.xml                                                      |    7 
 src/main/java/com/ruoyi/approve/controller/RpaProcessAutomationController.java                                 |   74 
 src/main/java/com/ruoyi/staff/mapper/HolidayApplicationMapper.java                                             |    9 
 src/main/java/com/ruoyi/warehouse/mapper/WarehouseGoodsShelvesRowcolMapper.java                                |   25 
 src/main/java/com/ruoyi/device/service/impl/DeviceLedgerServiceImpl.java                                       |    2 
 src/main/resources/mapper/oA/OaProjectMapper.xml                                                               |   32 
 src/main/java/com/ruoyi/oA/mapper/OaProjectPhaseTaskMapper.java                                                |   18 
 src/main/java/com/ruoyi/collaborativeApproval/service/impl/NoticeServiceImpl.java                              |   56 
 src/main/java/com/ruoyi/procurementrecord/pojo/ReturnManagement.java                                           |   72 
 src/main/resources/mapper/warehouse/DocumentationReturnManagementMapper.xml                                    |   57 
 src/main/java/com/ruoyi/inspectiontask/mapper/InspectionTaskMapper.java                                        |   11 
 src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java                              |   47 
 src/main/resources/mapper/collaborativeApproval/StaffContactsPersonalMapper.xml                                |   27 
 src/main/java/com/ruoyi/collaborativeApproval/service/SealApplicationManagementService.java                    |   10 
 src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java                                    |   15 
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPriceManagementController.java                 |   73 
 src/main/java/com/ruoyi/collaborativeApproval/mapper/MeetingMinutesMapper.java                                 |   18 
 src/main/java/com/ruoyi/staff/pojo/StaffJoinLeaveRecord.java                                                   |    8 
 src/main/java/com/ruoyi/warehouse/pojo/WarehouseGoodsShelves.java                                              |   79 
 src/main/java/com/ruoyi/procurementrecord/service/ProcurementPriceManagementService.java                       |   26 
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPlanServiceImpl.java                         |   41 
 src/main/resources/application-jjxm.yml                                                                        |  219 
 src/main/java/com/ruoyi/basic/pojo/StorageBlob.java                                                            |   47 
 src/main/java/com/ruoyi/collaborativeApproval/dto/MeetingSimpleDto.java                                        |   23 
 src/main/java/com/ruoyi/sales/mapper/ReceiptPaymentMapper.java                                                 |    2 
 src/main/resources/application-demo.yml                                                                        |   18 
 src/main/resources/mapper/account/AccountFileMapper.xml                                                        |    3 
 src/main/java/com/ruoyi/equipmentenergyconsumption/service/EnergyPeriodService.java                            |   10 
 src/main/java/com/ruoyi/customervisits/service/CustomerVisitsService.java                                      |   14 
 src/main/java/com/ruoyi/warehouse/mapper/DocumentationReturnManagementMapper.java                              |   33 
 src/main/java/com/ruoyi/collaborativeApproval/mapper/RulesRegulationsManagementMapper.java                     |   14 
 src/main/java/com/ruoyi/oA/controller/OaProjectController.java                                                 |   76 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java                              |    3 
 src/main/java/com/ruoyi/approve/service/KnowledgeBaseService.java                                              |   10 
 src/main/java/com/ruoyi/approve/mapper/NotificationManagementMapper.java                                       |   13 
 src/main/java/com/ruoyi/warehouse/dto/WarehouseDto.java                                                        |   13 
 src/main/java/com/ruoyi/equipmentenergyconsumption/pojo/EquipmentEnergyConsumption.java                        |    5 
 src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java                                             |   15 
 src/main/java/com/ruoyi/warehouse/dto/WarehouseGoodsShelvesDto.java                                            |   12 
 src/main/java/com/ruoyi/customervisits/controller/CustomerVisitsController.java                                |   50 
 src/main/java/com/ruoyi/collaborativeApproval/dto/RulesRegulationsManagementDTO.java                           |   16 
 src/main/resources/mapper/collaborativeApproval/ReadingStatusMapper.xml                                        |    6 
 src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml                                               |   11 
 src/main/resources/mapper/staff/PersonalAttendanceRecordsMapper.xml                                            |    7 
 src/main/resources/mapper/device/DeviceDefectRecordMapper.xml                                                  |   26 
 src/main/java/com/ruoyi/warehouse/pojo/DocumentClassification.java                                             |   67 
 src/main/java/com/ruoyi/waterrecord/pojo/WaterRecord.java                                                      |  135 
 src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceRecordsServiceImpl.java                           |   23 
 src/main/resources/mapper/purchase/ProductRecordMapper.xml                                                     |    1 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java                                              |    7 
 src/main/java/com/ruoyi/measuringinstrumentledger/pojo/SpareParts.java                                         |   59 
 src/main/resources/mapper/approve/HolidaySettingsMapper.xml                                                    |   17 
 src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementPlanMapper.java                                    |   22 
 src/main/java/com/ruoyi/collaborativeApproval/mapper/MeetingRoomMapper.java                                    |   18 
 src/main/resources/application-mkzs.yml                                                                        |  219 
 src/main/java/com/ruoyi/collaborativeApproval/dto/SealApplicationManagementDTO.java                            |   11 
 src/main/resources/mapper/lavorissue/LavorIssueMapper.xml                                                      |   78 
 src/main/java/com/ruoyi/collaborativeApproval/mapper/DutyPlanMapper.java                                       |   20 
 src/main/java/com/ruoyi/waterrecord/controller/WaterRecordController.java                                      |   91 
 src/main/resources/mapper/staff/StaffSchedulingMapper.xml                                                      |   52 
 src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java                                       |   77 
 src/main/java/com/ruoyi/inspectiontask/service/TimingTaskService.java                                          |   23 
 src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java                                                      |    8 
 src/main/resources/mapper/system/SysUserDeptMapper.xml                                                         |    2 
 src/main/java/com/ruoyi/oA/service/impl/OaProjectServiceImpl.java                                              |   69 
 src/main/java/com/ruoyi/lavorissue/service/LavorIssueService.java                                              |   34 
 src/main/java/com/ruoyi/procurementrecord/service/GasTankWarningService.java                                   |   15 
 src/main/resources/mapper/oA/OaProjectPhaseMapper.xml                                                          |   27 
 src/main/resources/mapper/collaborativeApproval/MeetingMinutesMapper.xml                                       |   24 
 src/main/java/com/ruoyi/staff/pojo/HolidayApplication.java                                                     |   58 
 src/main/java/com/ruoyi/waterrecord/service/impl/WaterRecordServiceImpl.java                                   |   52 
 src/main/java/com/ruoyi/inspectiontask/service/InspectionTaskService.java                                      |   20 
 src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingProcessDto.java                                    |    5 
 src/main/resources/application-qlmc.yml                                                                        |  219 
 src/main/java/com/ruoyi/collaborativeApproval/dto/MeetSummaryDto.java                                          |   24 
 src/main/java/com/ruoyi/equipmentenergyconsumption/dto/ElectricityConsumptionAreaTreeDto.java                  |   22 
 src/main/resources/application-hbkj.yml                                                                        |  219 
 src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/SparePartsServiceImpl.java                      |   73 
 src/main/java/com/ruoyi/customervisits/pojo/CustomerVisits.java                                                |  115 
 src/main/java/com/ruoyi/staff/dto/StaffSchedulingDto.java                                                      |   85 
 src/main/resources/mapper/collaborativeApproval/MeetDraftMapper.xml                                            |   34 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementUpdateDto.java                                        |    2 
 511 files changed, 27,103 insertions(+), 247 deletions(-)

diff --git a/pom.xml b/pom.xml
index 6a0e071..695a16c 100644
--- a/pom.xml
+++ b/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>
diff --git a/src/main/java/com/ruoyi/account/controller/AccountExpenseController.java b/src/main/java/com/ruoyi/account/controller/AccountExpenseController.java
index 44d1dbd..a6d771f 100644
--- a/src/main/java/com/ruoyi/account/controller/AccountExpenseController.java
+++ b/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());
     }
diff --git a/src/main/java/com/ruoyi/account/controller/AccountFileController.java b/src/main/java/com/ruoyi/account/controller/AccountFileController.java
index 3757bb2..130e7c8 100644
--- a/src/main/java/com/ruoyi/account/controller/AccountFileController.java
+++ b/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));
     }
diff --git a/src/main/java/com/ruoyi/account/controller/AccountIncomeController.java b/src/main/java/com/ruoyi/account/controller/AccountIncomeController.java
index 68e50f7..c6a24d7 100644
--- a/src/main/java/com/ruoyi/account/controller/AccountIncomeController.java
+++ b/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);
     }
diff --git a/src/main/java/com/ruoyi/account/service/AccountExpenseService.java b/src/main/java/com/ruoyi/account/service/AccountExpenseService.java
index 71fd214..7c91b2a 100644
--- a/src/main/java/com/ruoyi/account/service/AccountExpenseService.java
+++ b/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);
 }
diff --git a/src/main/java/com/ruoyi/account/service/AccountIncomeService.java b/src/main/java/com/ruoyi/account/service/AccountIncomeService.java
index fc30cda..037a0ea 100644
--- a/src/main/java/com/ruoyi/account/service/AccountIncomeService.java
+++ b/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);
 }
diff --git a/src/main/java/com/ruoyi/account/service/impl/AccountExpenseServiceImpl.java b/src/main/java/com/ruoyi/account/service/impl/AccountExpenseServiceImpl.java
index 37c2f7c..a3c775f 100644
--- a/src/main/java/com/ruoyi/account/service/impl/AccountExpenseServiceImpl.java
+++ b/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));
+    }
+
 
 }
diff --git a/src/main/java/com/ruoyi/account/service/impl/AccountIncomeServiceImpl.java b/src/main/java/com/ruoyi/account/service/impl/AccountIncomeServiceImpl.java
index 66fb6e4..199e399 100644
--- a/src/main/java/com/ruoyi/account/service/impl/AccountIncomeServiceImpl.java
+++ b/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));
+    }
 }
diff --git a/src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesServiceController.java b/src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesServiceController.java
index af0f61b..fee8947 100644
--- a/src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesServiceController.java
+++ b/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)
diff --git a/src/main/java/com/ruoyi/aftersalesservice/dto/AfterSalesServiceDto.java b/src/main/java/com/ruoyi/aftersalesservice/dto/AfterSalesServiceDto.java
new file mode 100644
index 0000000..8a7c70b
--- /dev/null
+++ b/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;
+
+}
diff --git a/src/main/java/com/ruoyi/aftersalesservice/pojo/AfterSalesService.java b/src/main/java/com/ruoyi/aftersalesservice/pojo/AfterSalesService.java
index f8c459d..67ccd01 100644
--- a/src/main/java/com/ruoyi/aftersalesservice/pojo/AfterSalesService.java
+++ b/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;
 
 
diff --git a/src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java b/src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java
index 9dcda81..6fb9986 100644
--- a/src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java
+++ b/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, "鍗忓悓瀹℃壒瀵煎嚭");
+    }
 }
diff --git a/src/main/java/com/ruoyi/approve/controller/HolidaySettingsController.java b/src/main/java/com/ruoyi/approve/controller/HolidaySettingsController.java
new file mode 100644
index 0000000..2ecf29f
--- /dev/null
+++ b/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("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        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("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        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("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        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("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        return AjaxResult.success(workingHoursSettingMapper.deleteBatchIds(ids));
+    }
+
+
+}
diff --git a/src/main/java/com/ruoyi/approve/controller/KnowledgeBaseController.java b/src/main/java/com/ruoyi/approve/controller/KnowledgeBaseController.java
new file mode 100644
index 0000000..b6ede4a
--- /dev/null
+++ b/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("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        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, "鐭ヨ瘑搴撶鐞嗗鍑�");
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/approve/controller/NotificationManagementController.java b/src/main/java/com/ruoyi/approve/controller/NotificationManagementController.java
new file mode 100644
index 0000000..e3ac566
--- /dev/null
+++ b/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("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        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));
+    }
+}
+
+
diff --git a/src/main/java/com/ruoyi/approve/controller/RpaProcessAutomationController.java b/src/main/java/com/ruoyi/approve/controller/RpaProcessAutomationController.java
new file mode 100644
index 0000000..e8c35f9
--- /dev/null
+++ b/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("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        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娴佺▼鑷姩鍖栧鍑�");
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/approve/mapper/AnnualLeaveSettingMapper.java b/src/main/java/com/ruoyi/approve/mapper/AnnualLeaveSettingMapper.java
new file mode 100644
index 0000000..034f752
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/approve/mapper/FileSharingMapper.java b/src/main/java/com/ruoyi/approve/mapper/FileSharingMapper.java
new file mode 100644
index 0000000..d8f311e
--- /dev/null
+++ b/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> {
+}
diff --git a/src/main/java/com/ruoyi/approve/mapper/HolidaySettingsMapper.java b/src/main/java/com/ruoyi/approve/mapper/HolidaySettingsMapper.java
new file mode 100644
index 0000000..a37485d
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/approve/mapper/KnowledgeBaseMapper.java b/src/main/java/com/ruoyi/approve/mapper/KnowledgeBaseMapper.java
new file mode 100644
index 0000000..adae509
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/approve/mapper/NotificationManagementMapper.java b/src/main/java/com/ruoyi/approve/mapper/NotificationManagementMapper.java
new file mode 100644
index 0000000..defede2
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/approve/mapper/OnlineMeetingMapper.java b/src/main/java/com/ruoyi/approve/mapper/OnlineMeetingMapper.java
new file mode 100644
index 0000000..fe7aa38
--- /dev/null
+++ b/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> {
+}
diff --git a/src/main/java/com/ruoyi/approve/mapper/OvertimeSettingMapper.java b/src/main/java/com/ruoyi/approve/mapper/OvertimeSettingMapper.java
new file mode 100644
index 0000000..ec564db
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/approve/mapper/RpaProcessAutomationMapper.java b/src/main/java/com/ruoyi/approve/mapper/RpaProcessAutomationMapper.java
new file mode 100644
index 0000000..e5f8769
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/approve/mapper/WorkingHoursSettingMapper.java b/src/main/java/com/ruoyi/approve/mapper/WorkingHoursSettingMapper.java
new file mode 100644
index 0000000..b5dad41
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/approve/pojo/AnnualLeaveSetting.java b/src/main/java/com/ruoyi/approve/pojo/AnnualLeaveSetting.java
new file mode 100644
index 0000000..2097b30
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java b/src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java
index 02e9f45..c1114bd 100644
--- a/src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java
+++ b/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;
 
     /**
diff --git a/src/main/java/com/ruoyi/approve/pojo/FileSharing.java b/src/main/java/com/ruoyi/approve/pojo/FileSharing.java
new file mode 100644
index 0000000..9c84034
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/approve/pojo/HolidaySettings.java b/src/main/java/com/ruoyi/approve/pojo/HolidaySettings.java
new file mode 100644
index 0000000..f3d9506
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/approve/pojo/KnowledgeBase.java b/src/main/java/com/ruoyi/approve/pojo/KnowledgeBase.java
new file mode 100644
index 0000000..a066e06
--- /dev/null
+++ b/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=瑙e喅鏂规,experience=缁忛獙鎬荤粨,guide=鎿嶄綔鎸囧崡")
+    private String type;
+    /**
+     * 閫傜敤鍦烘櫙
+     */
+    @Excel(name = "閫傜敤鍦烘櫙")
+    private String scenario;
+    /**
+     * 瑙e喅鏁堢巼
+     */
+    @Excel(name = "瑙e喅鏁堢巼",readConverterExp = "low=杞诲井鎻愬崌,medium=涓�鑸彁鍗�,high=鏄捐憲鎻愬崌")
+    private String efficiency;
+    /**
+     * 闂鎻忚堪
+     */
+    private String problem;
+    /**
+     * 瑙e喅鏂规
+     */
+    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;
+}
diff --git a/src/main/java/com/ruoyi/approve/pojo/NotificationManagement.java b/src/main/java/com/ruoyi/approve/pojo/NotificationManagement.java
new file mode 100644
index 0000000..cb91626
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/approve/pojo/OnlineMeeting.java b/src/main/java/com/ruoyi/approve/pojo/OnlineMeeting.java
new file mode 100644
index 0000000..863d348
--- /dev/null
+++ b/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;
+
+}
diff --git a/src/main/java/com/ruoyi/approve/pojo/OvertimeSetting.java b/src/main/java/com/ruoyi/approve/pojo/OvertimeSetting.java
new file mode 100644
index 0000000..ed929cd
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/approve/pojo/RpaProcessAutomation.java b/src/main/java/com/ruoyi/approve/pojo/RpaProcessAutomation.java
new file mode 100644
index 0000000..d47f2a0
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/approve/pojo/WorkingHoursSetting.java b/src/main/java/com/ruoyi/approve/pojo/WorkingHoursSetting.java
new file mode 100644
index 0000000..e457c8f
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/approve/service/HolidaySettingsService.java b/src/main/java/com/ruoyi/approve/service/HolidaySettingsService.java
new file mode 100644
index 0000000..aa44adb
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/approve/service/IApproveProcessService.java b/src/main/java/com/ruoyi/approve/service/IApproveProcessService.java
index d212c46..675c474 100644
--- a/src/main/java/com/ruoyi/approve/service/IApproveProcessService.java
+++ b/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);
 
diff --git a/src/main/java/com/ruoyi/approve/service/KnowledgeBaseService.java b/src/main/java/com/ruoyi/approve/service/KnowledgeBaseService.java
new file mode 100644
index 0000000..c8a3664
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/approve/service/NotificationManagementService.java b/src/main/java/com/ruoyi/approve/service/NotificationManagementService.java
new file mode 100644
index 0000000..8d2fade
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/approve/service/RpaProcessAutomationService.java b/src/main/java/com/ruoyi/approve/service/RpaProcessAutomationService.java
new file mode 100644
index 0000000..edf0011
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
index f7c98aa..d0ff36a 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
+++ b/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);
diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
index 2c04224..e866bbf 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
+++ b/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("璇烽�夋嫨姝g‘鐨勫鎵逛汉");
-            }
-            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("璇烽�夋嫨姝g‘鐨勫鎵逛汉");
+//                }
+//                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());
     }
 
 
diff --git a/src/main/java/com/ruoyi/approve/service/impl/HolidaySettingsServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/HolidaySettingsServiceImpl.java
new file mode 100644
index 0000000..a0cfe37
--- /dev/null
+++ b/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);
+    }
+}
diff --git a/src/main/java/com/ruoyi/approve/service/impl/KnowledgeBaseServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/KnowledgeBaseServiceImpl.java
new file mode 100644
index 0000000..57a3fa7
--- /dev/null
+++ b/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);
+    }
+}
diff --git a/src/main/java/com/ruoyi/approve/service/impl/NotificationManagementServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/NotificationManagementServiceImpl.java
new file mode 100644
index 0000000..fa13fa9
--- /dev/null
+++ b/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 瀹炰緥锛圛Page 瀹炵幇绫伙級锛屾寚瀹氶〉鐮佸拰姣忛〉鏉℃暟
+//        IPage<NotificationManagement> page1 = new Page<>(page.getCurrent(), page.getSize());
+        return notificationManagementMapper.listpage(page,notificationManagement);
+    }
+}
diff --git a/src/main/java/com/ruoyi/approve/service/impl/RpaProcessAutomationServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/RpaProcessAutomationServiceImpl.java
new file mode 100644
index 0000000..ddb6083
--- /dev/null
+++ b/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);
+    }
+}
diff --git a/src/main/java/com/ruoyi/approve/utils/ListToStringTypeHandler.java b/src/main/java/com/ruoyi/approve/utils/ListToStringTypeHandler.java
new file mode 100644
index 0000000..4042a25
--- /dev/null
+++ b/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<>();
+    }
+
+}
+
diff --git a/src/main/java/com/ruoyi/approve/utils/StartAndEndDateDto.java b/src/main/java/com/ruoyi/approve/utils/StartAndEndDateDto.java
index 0c9eb11..7913ffd 100644
--- a/src/main/java/com/ruoyi/approve/utils/StartAndEndDateDto.java
+++ b/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;
+
+
 }
diff --git a/src/main/java/com/ruoyi/approve/vo/ApproveGetAndUpdateVo.java b/src/main/java/com/ruoyi/approve/vo/ApproveGetAndUpdateVo.java
index 98c5d52..69d5dea 100644
--- a/src/main/java/com/ruoyi/approve/vo/ApproveGetAndUpdateVo.java
+++ b/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;
 }
diff --git a/src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java b/src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java
index 8d793d8..1fb353e 100644
--- a/src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java
+++ b/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;
 }
diff --git a/src/main/java/com/ruoyi/basic/controller/CustomerController.java b/src/main/java/com/ruoyi/basic/controller/CustomerController.java
index 132e5bd..e89e203 100644
--- a/src/main/java/com/ruoyi/basic/controller/CustomerController.java
+++ b/src/main/java/com/ruoyi/basic/controller/CustomerController.java
@@ -53,6 +53,13 @@
         util.exportExcel(response, list, "瀹㈡埛妗f鏁版嵁");
     }
 
+    @PostMapping("/downloadTemplate")
+    @Log(title = "瀹㈡埛妗f-涓嬭浇妯℃澘", businessType = BusinessType.EXPORT)
+    public void downloadTemplate(HttpServletResponse response) {
+        ExcelUtil<Customer> util = new ExcelUtil<Customer>(Customer.class);
+        util.importTemplateExcel(response, "瀹㈡埛妗f妯℃澘");
+    }
+
 
     /**
      * 瀵煎叆瀹㈡埛妗f
diff --git a/src/main/java/com/ruoyi/basic/controller/SupplierManageController.java b/src/main/java/com/ruoyi/basic/controller/SupplierManageController.java
index b50f88f..32cad29 100644
--- a/src/main/java/com/ruoyi/basic/controller/SupplierManageController.java
+++ b/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, "渚涘簲鍟嗘。妗堟ā鏉�");
+    }
+
     /**
      * 渚涘簲鍟嗗鍏�
      */
diff --git a/src/main/java/com/ruoyi/basic/dto/StorageBlobDTO.java b/src/main/java/com/ruoyi/basic/dto/StorageBlobDTO.java
index b868048..17a7d71 100644
--- a/src/main/java/com/ruoyi/basic/dto/StorageBlobDTO.java
+++ b/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;
 }
diff --git a/src/main/java/com/ruoyi/basic/mapper/StorageAttachmentMapper.java b/src/main/java/com/ruoyi/basic/mapper/StorageAttachmentMapper.java
index 12a34d8..529e05d 100644
--- a/src/main/java/com/ruoyi/basic/mapper/StorageAttachmentMapper.java
+++ b/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> {
 
 }
diff --git a/src/main/java/com/ruoyi/basic/pojo/StorageAttachment.java b/src/main/java/com/ruoyi/basic/pojo/StorageAttachment.java
index 0e30cad..1dd7bc7 100644
--- a/src/main/java/com/ruoyi/basic/pojo/StorageAttachment.java
+++ b/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) {
diff --git a/src/main/java/com/ruoyi/basic/pojo/StorageBlob.java b/src/main/java/com/ruoyi/basic/pojo/StorageBlob.java
index 8e92865..6bf6fc6 100644
--- a/src/main/java/com/ruoyi/basic/pojo/StorageBlob.java
+++ b/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;
     /**
      * 璧勬簮绫诲瀷锛屼緥濡侸PG鍥剧墖鐨勮祫婧愮被鍨嬩负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;
 }
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/basic/pojo/SupplierManage.java b/src/main/java/com/ruoyi/basic/pojo/SupplierManage.java
index 3855879..142a6f2 100644
--- a/src/main/java/com/ruoyi/basic/pojo/SupplierManage.java
+++ b/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 = "缁存姢浜篒D")
+    @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 = "鍒涘缓鏃堕棿")
diff --git a/src/main/java/com/ruoyi/basic/service/StorageAttachmentService.java b/src/main/java/com/ruoyi/basic/service/StorageAttachmentService.java
index e285063..de2c096 100644
--- a/src/main/java/com/ruoyi/basic/service/StorageAttachmentService.java
+++ b/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 鏂囦欢淇℃伅
diff --git a/src/main/java/com/ruoyi/basic/service/StorageBlobService.java b/src/main/java/com/ruoyi/basic/service/StorageBlobService.java
index 00d8c3b..962437d 100644
--- a/src/main/java/com/ruoyi/basic/service/StorageBlobService.java
+++ b/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
diff --git a/src/main/java/com/ruoyi/basic/service/impl/StorageAttachmentServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/StorageAttachmentServiceImpl.java
index 78c8647..0d126c7 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/StorageAttachmentServiceImpl.java
+++ b/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);
diff --git a/src/main/java/com/ruoyi/basic/service/impl/StorageBlobServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/StorageBlobServiceImpl.java
index 6be4401..d85a522 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/StorageBlobServiceImpl.java
+++ b/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",
+
+                // 缂栫▼浠g爜鏂囦欢
+                "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()) {
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/controller/DutyPlanController.java b/src/main/java/com/ruoyi/collaborativeApproval/controller/DutyPlanController.java
new file mode 100644
index 0000000..9ad69ee
--- /dev/null
+++ b/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("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        }
+        return AjaxResult.success(dutyPlanService.removeBatchByIds(ids));
+    }
+    @PostMapping("/export")
+    @ApiOperation("瀵煎嚭")
+    public void exportData(HttpServletResponse response, DutyPlanDTO dutyPlanDTO){
+        dutyPlanService.exportData(response, dutyPlanDTO);
+    }
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/controller/MeetingController.java b/src/main/java/com/ruoyi/collaborativeApproval/controller/MeetingController.java
new file mode 100644
index 0000000..6c53634
--- /dev/null
+++ b/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, "浼氳鑽夌瀵煎嚭");
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/controller/NoticeController.java b/src/main/java/com/ruoyi/collaborativeApproval/controller/NoticeController.java
new file mode 100644
index 0000000..df8e248
--- /dev/null
+++ b/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("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        }
+        return AjaxResult.success(noticeService.removeBatchByIds(ids));
+    }
+
+    @GetMapping("/count")
+    @Log(title = "鑾峰彇鍏憡鏁伴噺", businessType = BusinessType.OTHER)
+    @ApiOperation("鑾峰彇鍏憡鏁伴噺")
+    public AjaxResult count(){
+        return AjaxResult.success(noticeService.selectCount());
+    }
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementController.java b/src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementController.java
new file mode 100644
index 0000000..acfe676
--- /dev/null
+++ b/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("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        }
+        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, "瑙勭珷鍒跺害绠$悊瀵煎嚭");
+    }
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/controller/SealApplicationManagementController.java b/src/main/java/com/ruoyi/collaborativeApproval/controller/SealApplicationManagementController.java
new file mode 100644
index 0000000..242072e
--- /dev/null
+++ b/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("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        }
+        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, "鐢ㄥ嵃鐢宠绠$悊瀵煎嚭");
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/controller/StaffContactsPersonalController.java b/src/main/java/com/ruoyi/collaborativeApproval/controller/StaffContactsPersonalController.java
new file mode 100644
index 0000000..f189872
--- /dev/null
+++ b/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("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+//        }
+        return AjaxResult.success(staffContactsPersonalService.removeById(id));
+    }
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/dto/DutyPlanDTO.java b/src/main/java/com/ruoyi/collaborativeApproval/dto/DutyPlanDTO.java
new file mode 100644
index 0000000..4f3936f
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/dto/MeetSummaryDto.java b/src/main/java/com/ruoyi/collaborativeApproval/dto/MeetSummaryDto.java
new file mode 100644
index 0000000..1c43eeb
--- /dev/null
+++ b/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;
+
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/dto/MeetUseDto.java b/src/main/java/com/ruoyi/collaborativeApproval/dto/MeetUseDto.java
new file mode 100644
index 0000000..68e0d68
--- /dev/null
+++ b/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<>();
+
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/dto/MeetingItem.java b/src/main/java/com/ruoyi/collaborativeApproval/dto/MeetingItem.java
new file mode 100644
index 0000000..b804076
--- /dev/null
+++ b/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;
+
+
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/dto/MeetingSimpleDto.java b/src/main/java/com/ruoyi/collaborativeApproval/dto/MeetingSimpleDto.java
new file mode 100644
index 0000000..3b1aaf3
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/dto/NoticeDTO.java b/src/main/java/com/ruoyi/collaborativeApproval/dto/NoticeDTO.java
new file mode 100644
index 0000000..e7db276
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/dto/RulesRegulationsManagementDTO.java b/src/main/java/com/ruoyi/collaborativeApproval/dto/RulesRegulationsManagementDTO.java
new file mode 100644
index 0000000..61de2e9
--- /dev/null
+++ b/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;
+
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/dto/SealApplicationManagementDTO.java b/src/main/java/com/ruoyi/collaborativeApproval/dto/SealApplicationManagementDTO.java
new file mode 100644
index 0000000..0dc75a6
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/dto/StaffContactsPersonalDTO.java b/src/main/java/com/ruoyi/collaborativeApproval/dto/StaffContactsPersonalDTO.java
new file mode 100644
index 0000000..29c1d50
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/mapper/DutyPlanMapper.java b/src/main/java/com/ruoyi/collaborativeApproval/mapper/DutyPlanMapper.java
new file mode 100644
index 0000000..b9bffe1
--- /dev/null
+++ b/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();
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/mapper/MeetApplicationMapper.java b/src/main/java/com/ruoyi/collaborativeApproval/mapper/MeetApplicationMapper.java
new file mode 100644
index 0000000..15c1eed
--- /dev/null
+++ b/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 閽堝琛ㄣ�恗eet_application(浼氳鐢宠琛�)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @createDate 2025-09-15 15:54:20
+* @Entity com.ruoyi.collaborativeApproval.pojo.MeetApplication
+*/
+public interface MeetApplicationMapper extends BaseMapper<MeetApplication> {
+
+    MeetSummaryDto getMeetSummary();
+
+    List<MeetingSimpleDto> getMeetSummaryItems();
+
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/mapper/MeetDraftMapper.java b/src/main/java/com/ruoyi/collaborativeApproval/mapper/MeetDraftMapper.java
new file mode 100644
index 0000000..e6c6835
--- /dev/null
+++ b/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 閽堝琛ㄣ�恗eet_draft(浼氳鑽夌琛�)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @createDate 2025-09-15 14:10:49
+* @Entity com.ruoyi.collaborativeApproval.pojo.MeetDraft
+*/
+public interface MeetDraftMapper extends BaseMapper<MeetDraft> {
+
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/mapper/MeetingMinutesMapper.java b/src/main/java/com/ruoyi/collaborativeApproval/mapper/MeetingMinutesMapper.java
new file mode 100644
index 0000000..14985a6
--- /dev/null
+++ b/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 閽堝琛ㄣ�恗eeting_minutes(浼氳绾琛�)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @createDate 2025-09-17 10:25:20
+* @Entity com.ruoyi.collaborativeApproval.pojo.MeetingMinutes
+*/
+public interface MeetingMinutesMapper extends BaseMapper<MeetingMinutes> {
+
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/mapper/MeetingRoomMapper.java b/src/main/java/com/ruoyi/collaborativeApproval/mapper/MeetingRoomMapper.java
new file mode 100644
index 0000000..5fd825a
--- /dev/null
+++ b/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 閽堝琛ㄣ�恗eeting_room(浼氳瀹よ〃)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @createDate 2025-09-15 10:32:50
+* @Entity com.ruoyi.collaborativeApproval.pojo.MeetingRoom
+*/
+public interface MeetingRoomMapper extends BaseMapper<MeetingRoom> {
+
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/mapper/NoticeMapper.java b/src/main/java/com/ruoyi/collaborativeApproval/mapper/NoticeMapper.java
new file mode 100644
index 0000000..1b6d67d
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/mapper/ReadingStatusMapper.java b/src/main/java/com/ruoyi/collaborativeApproval/mapper/ReadingStatusMapper.java
new file mode 100644
index 0000000..84834f9
--- /dev/null
+++ b/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> {
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/mapper/RulesRegulationsManagementMapper.java b/src/main/java/com/ruoyi/collaborativeApproval/mapper/RulesRegulationsManagementMapper.java
new file mode 100644
index 0000000..d37e631
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/mapper/SealApplicationManagementMapper.java b/src/main/java/com/ruoyi/collaborativeApproval/mapper/SealApplicationManagementMapper.java
new file mode 100644
index 0000000..3b5e55f
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/mapper/StaffContactsPersonalMapper.java b/src/main/java/com/ruoyi/collaborativeApproval/mapper/StaffContactsPersonalMapper.java
new file mode 100644
index 0000000..934805f
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/pojo/DutyPlan.java b/src/main/java/com/ruoyi/collaborativeApproval/pojo/DutyPlan.java
new file mode 100644
index 0000000..1a55190
--- /dev/null
+++ b/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;
+
+
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/pojo/MeetApplication.java b/src/main/java/com/ruoyi/collaborativeApproval/pojo/MeetApplication.java
new file mode 100644
index 0000000..5f9ad1d
--- /dev/null
+++ b/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;
+
+    /**
+     * 浼氳瀹D
+     */
+    @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;
+
+    /**
+     * 鍙備細浜哄憳锛圝SON鏍煎紡瀛樺偍ID鏁扮粍锛�
+     */
+    @TableField(value = "participants")
+    private String participants;
+
+    /**
+     * 浼氳璇存槑
+     */
+    @TableField(value = "description")
+    private String description;
+
+    /**
+     * 鐢宠绫诲瀷锛坅pproval:瀹℃壒娴佺▼, 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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/pojo/MeetDraft.java b/src/main/java/com/ruoyi/collaborativeApproval/pojo/MeetDraft.java
new file mode 100644
index 0000000..7df4b0a
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/pojo/MeetingMinutes.java b/src/main/java/com/ruoyi/collaborativeApproval/pojo/MeetingMinutes.java
new file mode 100644
index 0000000..bd80254
--- /dev/null
+++ b/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;
+
+    /**
+     * 鍏宠仈鐨勪細璁甀D
+     */
+    @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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/pojo/MeetingRoom.java b/src/main/java/com/ruoyi/collaborativeApproval/pojo/MeetingRoom.java
new file mode 100644
index 0000000..9742071
--- /dev/null
+++ b/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 {
+    /**
+     * 浼氳瀹D
+     */
+    @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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/pojo/Notice.java b/src/main/java/com/ruoyi/collaborativeApproval/pojo/Notice.java
new file mode 100644
index 0000000..cc9f926
--- /dev/null
+++ b/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;
+
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/pojo/ReadingStatus.java b/src/main/java/com/ruoyi/collaborativeApproval/pojo/ReadingStatus.java
new file mode 100644
index 0000000..1aa4892
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/pojo/RulesRegulationsManagement.java b/src/main/java/com/ruoyi/collaborativeApproval/pojo/RulesRegulationsManagement.java
new file mode 100644
index 0000000..cc32e10
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/pojo/SealApplicationManagement.java b/src/main/java/com/ruoyi/collaborativeApproval/pojo/SealApplicationManagement.java
new file mode 100644
index 0000000..d6d1d81
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/pojo/StaffContactsPersonal.java b/src/main/java/com/ruoyi/collaborativeApproval/pojo/StaffContactsPersonal.java
new file mode 100644
index 0000000..967769e
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/service/DutyPlanService.java b/src/main/java/com/ruoyi/collaborativeApproval/service/DutyPlanService.java
new file mode 100644
index 0000000..67bff22
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/service/MeetingService.java b/src/main/java/com/ruoyi/collaborativeApproval/service/MeetingService.java
new file mode 100644
index 0000000..7b3c906
--- /dev/null
+++ b/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();
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/service/NoticeService.java b/src/main/java/com/ruoyi/collaborativeApproval/service/NoticeService.java
new file mode 100644
index 0000000..31ded68
--- /dev/null
+++ b/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();
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/service/RulesRegulationsManagementService.java b/src/main/java/com/ruoyi/collaborativeApproval/service/RulesRegulationsManagementService.java
new file mode 100644
index 0000000..270fa56
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/service/SealApplicationManagementService.java b/src/main/java/com/ruoyi/collaborativeApproval/service/SealApplicationManagementService.java
new file mode 100644
index 0000000..d0d931a
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/service/StaffContactsPersonalService.java b/src/main/java/com/ruoyi/collaborativeApproval/service/StaffContactsPersonalService.java
new file mode 100644
index 0000000..d06133d
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/service/impl/DutyPlanServiceImpl.java b/src/main/java/com/ruoyi/collaborativeApproval/service/impl/DutyPlanServiceImpl.java
new file mode 100644
index 0000000..b70f67a
--- /dev/null
+++ b/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, "璁″垝瀵煎嚭");
+    }
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/service/impl/MeetingServiceImpl.java b/src/main/java/com/ruoyi/collaborativeApproval/service/impl/MeetingServiceImpl.java
new file mode 100644
index 0000000..c269b1a
--- /dev/null
+++ b/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();
+    }
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/service/impl/NoticeServiceImpl.java b/src/main/java/com/ruoyi/collaborativeApproval/service/impl/NoticeServiceImpl.java
new file mode 100644
index 0000000..d6504a1
--- /dev/null
+++ b/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("姝e父");
+            }
+        });
+        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;
+    }
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/service/impl/RulesRegulationsManagementServiceImpl.java b/src/main/java/com/ruoyi/collaborativeApproval/service/impl/RulesRegulationsManagementServiceImpl.java
new file mode 100644
index 0000000..a4f912e
--- /dev/null
+++ b/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);
+    }
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/service/impl/SealApplicationManagementServiceImpl.java b/src/main/java/com/ruoyi/collaborativeApproval/service/impl/SealApplicationManagementServiceImpl.java
new file mode 100644
index 0000000..6cb8a2b
--- /dev/null
+++ b/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);
+    }
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/service/impl/StaffContactsPersonalServiceImpl.java b/src/main/java/com/ruoyi/collaborativeApproval/service/impl/StaffContactsPersonalServiceImpl.java
new file mode 100644
index 0000000..1a77996
--- /dev/null
+++ b/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);
+    }
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/vo/SearchMeetingApplicationVo.java b/src/main/java/com/ruoyi/collaborativeApproval/vo/SearchMeetingApplicationVo.java
new file mode 100644
index 0000000..04fbf46
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/vo/SearchMeetingDraftVo.java b/src/main/java/com/ruoyi/collaborativeApproval/vo/SearchMeetingDraftVo.java
new file mode 100644
index 0000000..6178e1d
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/vo/SearchMeetingRoomVo.java b/src/main/java/com/ruoyi/collaborativeApproval/vo/SearchMeetingRoomVo.java
new file mode 100644
index 0000000..1af4c04
--- /dev/null
+++ b/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;
+
+}
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/vo/SearchMeetingUseVo.java b/src/main/java/com/ruoyi/collaborativeApproval/vo/SearchMeetingUseVo.java
new file mode 100644
index 0000000..a782b19
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/common/enums/FileNameType.java b/src/main/java/com/ruoyi/common/enums/FileNameType.java
index ded6e9f..16d51f6 100644
--- a/src/main/java/com/ruoyi/common/enums/FileNameType.java
+++ b/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;
 
diff --git a/src/main/java/com/ruoyi/common/enums/StorageAttachmentRecordType.java b/src/main/java/com/ruoyi/common/enums/StorageAttachmentRecordType.java
index 8b0597e..a4b889d 100644
--- a/src/main/java/com/ruoyi/common/enums/StorageAttachmentRecordType.java
+++ b/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;
diff --git a/src/main/java/com/ruoyi/common/utils/MinioUtils.java b/src/main/java/com/ruoyi/common/utils/MinioUtils.java
index 55af1dd..d192f93 100644
--- a/src/main/java/com/ruoyi/common/utils/MinioUtils.java
+++ b/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 鏂囦欢鍦∕inIO涓殑鍞竴鏍囪瘑
+     * @param bucketName 瀛樺偍妗跺悕绉�
+     * @param useDefaultExpiry 鏄惁浣跨敤榛樿杩囨湡鏃堕棿锛坱rue=浣跨敤榛樿杩囨湡鏃堕棿锛宖alse=姘镐箙鏈夋晥锛�
+     * @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);
+
+            // 璁剧疆杩囨湡鏃堕棿锛歶seDefaultExpiry=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 鏂囦欢鍦∕inIO涓殑鍞竴鏍囪瘑
+     * @param bucketName 瀛樺偍妗跺悕绉�
+     * @param originalFileName 鍘熷鏂囦欢鍚嶏紙鐢ㄤ簬涓嬭浇鏃舵樉绀猴級
+     * @param useDefaultExpiry 鏄惁浣跨敤榛樿杩囨湡鏃堕棿锛坱rue=浣跨敤榛樿锛宖alse=鏃犺繃鏈熸椂闂达級
+     * @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());
+
+            // 姝g‘缂栫爜鏂囦欢鍚嶏細鏇挎崲 + 涓� %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)) + "\"");
+
+                // 鏋勫缓棰勭鍚峌RL鍙傛暟
+                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;
+    }
+
 }
diff --git a/src/main/java/com/ruoyi/common/utils/OrderUtils.java b/src/main/java/com/ruoyi/common/utils/OrderUtils.java
new file mode 100644
index 0000000..42c154d
--- /dev/null
+++ b/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 {
+
+
+    /**
+     * 鏌ヨ褰撳ぉ锛堝熀浜巆reateTime瀛楁锛夌殑璁板綍鏁伴噺
+     * @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
+        );
+
+        // 杞崲涓篋ate绫诲瀷锛堝鏋滃疄浣撶被涓璫reateTime鏄疞ocalDateTime鍙洿鎺ヤ娇鐢級
+        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 + 鏃堕棿锛坹yyyMMdd锛� + 璁㈠崟鏁伴噺(001)
+        return preFix + LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE).replaceAll("-", "") + String.format("%03d", (aLong + 1));}
+}
diff --git a/src/main/java/com/ruoyi/common/utils/excel/ConfigurableMergeStrategy.java b/src/main/java/com/ruoyi/common/utils/excel/ConfigurableMergeStrategy.java
new file mode 100644
index 0000000..6d59d27
--- /dev/null
+++ b/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;
+            }
+        }
+    }
+}
diff --git a/src/main/java/com/ruoyi/common/utils/excel/CustomCellStyleHandler.java b/src/main/java/com/ruoyi/common/utils/excel/CustomCellStyleHandler.java
new file mode 100644
index 0000000..7c095e7
--- /dev/null
+++ b/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);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/common/utils/excel/ExcelClassField.java b/src/main/java/com/ruoyi/common/utils/excel/ExcelClassField.java
new file mode 100644
index 0000000..de42dd9
--- /dev/null
+++ b/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;
+ 
+    /** 鏄惁涓烘敞瑙e瓧娈碉細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;
+    }
+ 
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/common/utils/excel/ExcelExport.java b/src/main/java/com/ruoyi/common/utils/excel/ExcelExport.java
new file mode 100644
index 0000000..06ffc83
--- /dev/null
+++ b/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();
+ 
+    /** 瀵煎嚭鎺掑簭鍏堝悗: 鏁板瓧瓒婂皬瓒婇潬鍓嶏紙榛樿鎸塉ava绫诲瓧娈甸『搴忓鍑猴級 */
+    int sort() default 0;
+ 
+    /** 瀵煎嚭鏄犲皠锛屾牸寮忓锛�0-鏈煡;1-鐢�;2-濂� */
+    String kv() default "";
+ 
+    /** 瀵煎嚭妯℃澘绀轰緥鍊硷紙鏈夊�肩殑璇濓紝鐩存帴鍙栬鍊硷紝涓嶅仛鏄犲皠锛� */
+    String example() default "";
+ 
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/common/utils/excel/ExcelImport.java b/src/main/java/com/ruoyi/common/utils/excel/ExcelImport.java
new file mode 100644
index 0000000..cbfcf7f
--- /dev/null
+++ b/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;
+ 
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/common/utils/excel/ExcelUtils.java b/src/main/java/com/ruoyi/common/utils/excel/ExcelUtils.java
new file mode 100644
index 0000000..230bb77
--- /dev/null
+++ b/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]鐨勫�间笉姝g‘(褰撳墠鍊间负%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]鐨勫�兼牸寮忎笉姝g‘(褰撳墠鍊间负%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;
+        }
+        // 瑙f瀽琛ㄦ牸鏁版嵁
+        InputStream in;
+        String fileName;
+        if (mFile != null) {
+            // 涓婁紶鏂囦欢瑙f瀽
+            in = mFile.getInputStream();
+            fileName = getString(mFile.getOriginalFilename()).toLowerCase();
+        } else {
+            // 鏈湴鏂囦欢瑙f瀽
+            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);
+            }
+        }
+        // 濡傛灉琛ㄥご娌℃湁鏁版嵁鍒欎笉杩涜瑙f瀽
+        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) {
+        // 瑙f瀽鎵�鏈夊瓧娈�
+        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());
+        // 瑙f瀽鏄犲皠
+        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);
+            }
+        }
+        // 鍚堝苟鍒版柊鍖哄煙锛堣繖閲岀畝鍗曞湴灏嗗畠浠坊鍔犲埌鏂扮殑鍚堝苟鍖哄煙鍒楄〃涓紝瀹為檯搴旂敤涓彲鑳介渶瑕佹洿澶嶆潅鐨勯�昏緫鏉ョ湡姝b�滃悎骞垛�濆尯鍩燂級
+        // 娉ㄦ剰锛歅OI鐨凜ellRangeAddress娌℃湁鎻愪緵鐩存帴鍚堝苟涓や釜鍖哄煙鐨勬柟娉曪紝鎵�浠ヨ繖閲屽彧鏄ず渚�
+        // 濡傛灉闇�瑕佺湡姝g殑鍚堝苟锛屽彲鑳介渶瑕佽嚜瀹氫箟閫昏緫鏉ヨ绠楁柊鐨勮竟鐣�
+        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浣嶆椂锛屾敼涓哄瓧绗︿覆绫诲瀷鏄剧ず锛圗xcel鏁板瓧瓒呰繃涓�瀹氶暱搴︿細鏄剧ず涓虹瀛﹁鏁版硶锛�
+            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;
+        }
+        // 鏄惁涓築oolean
+        if (o instanceof Boolean) {
+            cell.setCellType(CellType.BOOLEAN);
+            cell.setCellValue((Boolean) o);
+            return CELL_OTHER;
+        }
+        // 濡傛灉鏄疊igDecimal锛屽垯榛樿3浣嶅皬鏁�
+        if (o instanceof BigDecimal) {
+            cell.setCellType(CellType.NUMERIC);
+            cell.setCellValue(((BigDecimal) o).setScale(3, RoundingMode.HALF_UP).doubleValue());
+            return CELL_OTHER;
+        }
+        // 濡傛灉鏄疍ate鏁版嵁锛屽垯鏄剧ず鏍煎紡鍖栨暟鎹�
+        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));
+        // 锛坖dk1.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();
+    }
+ 
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/compensationperformance/controller/CompensationPerformanceController.java b/src/main/java/com/ruoyi/compensationperformance/controller/CompensationPerformanceController.java
index 1844b3e..84fdbe5 100644
--- a/src/main/java/com/ruoyi/compensationperformance/controller/CompensationPerformanceController.java
+++ b/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, "瀵煎嚭钖祫绠$悊鍒楄〃");
+    }
+
 
 }
diff --git a/src/main/java/com/ruoyi/compensationperformance/pojo/CompensationPerformance.java b/src/main/java/com/ruoyi/compensationperformance/pojo/CompensationPerformance.java
index 5fb2c7a..499d75a 100644
--- a/src/main/java/com/ruoyi/compensationperformance/pojo/CompensationPerformance.java
+++ b/src/main/java/com/ruoyi/compensationperformance/pojo/CompensationPerformance.java
@@ -31,7 +31,6 @@
      * 鍛樺伐id
      */
     @ApiModelProperty("鍛樺伐id")
-    @Excel(name = "鍛樺伐id")
     private Long staffId;
 
     /**
diff --git a/src/main/java/com/ruoyi/customervisits/controller/CustomerVisitsController.java b/src/main/java/com/ruoyi/customervisits/controller/CustomerVisitsController.java
new file mode 100644
index 0000000..3d26445
--- /dev/null
+++ b/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("娣诲姞澶辫触");
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/customervisits/mapper/CustomerVisitsMapper.java b/src/main/java/com/ruoyi/customervisits/mapper/CustomerVisitsMapper.java
new file mode 100644
index 0000000..24d4721
--- /dev/null
+++ b/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> {
+}
diff --git a/src/main/java/com/ruoyi/customervisits/pojo/CustomerVisits.java b/src/main/java/com/ruoyi/customervisits/pojo/CustomerVisits.java
new file mode 100644
index 0000000..722ab60
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/customervisits/service/CustomerVisitsService.java b/src/main/java/com/ruoyi/customervisits/service/CustomerVisitsService.java
new file mode 100644
index 0000000..f4463e2
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/customervisits/service/impl/CustomerVisitsServiceImpl.java b/src/main/java/com/ruoyi/customervisits/service/impl/CustomerVisitsServiceImpl.java
new file mode 100644
index 0000000..5023c99
--- /dev/null
+++ b/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;
+    }
+}
diff --git a/src/main/java/com/ruoyi/device/controller/DeviceDefectRecordController.java b/src/main/java/com/ruoyi/device/controller/DeviceDefectRecordController.java
new file mode 100644
index 0000000..dc103fb
--- /dev/null
+++ b/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));
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java b/src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java
index abac6a7..f00595f 100644
--- a/src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java
+++ b/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);
+    }
 }
diff --git a/src/main/java/com/ruoyi/device/controller/DeviceRepairController.java b/src/main/java/com/ruoyi/device/controller/DeviceRepairController.java
index 8c103ed..5c3dd58 100644
--- a/src/main/java/com/ruoyi/device/controller/DeviceRepairController.java
+++ b/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);
     }
 
diff --git a/src/main/java/com/ruoyi/device/dto/DeviceDefectRecordDto.java b/src/main/java/com/ruoyi/device/dto/DeviceDefectRecordDto.java
new file mode 100644
index 0000000..aa1e0aa
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/device/dto/DeviceLedgerDto.java b/src/main/java/com/ruoyi/device/dto/DeviceLedgerDto.java
index 65faef8..26bdc91 100644
--- a/src/main/java/com/ruoyi/device/dto/DeviceLedgerDto.java
+++ b/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;
 }
diff --git a/src/main/java/com/ruoyi/device/execl/DeviceMaintenanceExeclDto.java b/src/main/java/com/ruoyi/device/execl/DeviceMaintenanceExeclDto.java
index 92dd71a..6cd3316 100644
--- a/src/main/java/com/ruoyi/device/execl/DeviceMaintenanceExeclDto.java
+++ b/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;
 
 }
diff --git a/src/main/java/com/ruoyi/device/execl/DeviceRepairExeclDto.java b/src/main/java/com/ruoyi/device/execl/DeviceRepairExeclDto.java
index 958db15..a1b15f3 100644
--- a/src/main/java/com/ruoyi/device/execl/DeviceRepairExeclDto.java
+++ b/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;
 
diff --git a/src/main/java/com/ruoyi/device/mapper/DeviceDefectRecordMapper.java b/src/main/java/com/ruoyi/device/mapper/DeviceDefectRecordMapper.java
new file mode 100644
index 0000000..11d38ff
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/device/mapper/DeviceLedgerMapper.java b/src/main/java/com/ruoyi/device/mapper/DeviceLedgerMapper.java
index 558b55b..17683d4 100644
--- a/src/main/java/com/ruoyi/device/mapper/DeviceLedgerMapper.java
+++ b/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);
 }
diff --git a/src/main/java/com/ruoyi/device/mapper/DeviceMaintenanceMapper.java b/src/main/java/com/ruoyi/device/mapper/DeviceMaintenanceMapper.java
index 5fde866..86c726b 100644
--- a/src/main/java/com/ruoyi/device/mapper/DeviceMaintenanceMapper.java
+++ b/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);
 }
diff --git a/src/main/java/com/ruoyi/device/pojo/DeviceDefectRecord.java b/src/main/java/com/ruoyi/device/pojo/DeviceDefectRecord.java
new file mode 100644
index 0000000..966b8ae
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/device/pojo/DeviceLedger.java b/src/main/java/com/ruoyi/device/pojo/DeviceLedger.java
index 01233be..caa8f32 100644
--- a/src/main/java/com/ruoyi/device/pojo/DeviceLedger.java
+++ b/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;
 }
diff --git a/src/main/java/com/ruoyi/device/service/DeviceDefectRecordService.java b/src/main/java/com/ruoyi/device/service/DeviceDefectRecordService.java
new file mode 100644
index 0000000..70852d0
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/device/service/impl/DeviceDefectRecordServiceImpl.java b/src/main/java/com/ruoyi/device/service/impl/DeviceDefectRecordServiceImpl.java
new file mode 100644
index 0000000..2394982
--- /dev/null
+++ b/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("姝e父");
+//            deviceDefectRecord.setEliminateTime(LocalDateTime.now());
+            throw new RuntimeException("涓ラ噸缂洪櫡-璁惧缁翠慨鍚庢洿鏂颁负姝e父鐘舵��");
+        } else if (status.equals("涓�鑸己闄�")) {
+            deviceDefectRecord.setStatus("姝e父");
+        }
+        deviceDefectRecord.setEliminateTime(LocalDateTime.now());
+        return updateById(deviceDefectRecord);
+    }
+
+
+}
diff --git a/src/main/java/com/ruoyi/device/service/impl/DeviceLedgerServiceImpl.java b/src/main/java/com/ruoyi/device/service/impl/DeviceLedgerServiceImpl.java
index 0687aad..420ed9a 100644
--- a/src/main/java/com/ruoyi/device/service/impl/DeviceLedgerServiceImpl.java
+++ b/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;
diff --git a/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java b/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java
index 9c92254..011d32b 100644
--- a/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java
+++ b/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);
         });
diff --git a/src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java b/src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java
index a4f148c..1f09d07 100644
--- a/src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java
+++ b/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("姝e父");
+                    deviceDefectRecordService.updateByDDR(deviceDefectRecord);
+                });
+            }
             return AjaxResult.success();
         }
         return AjaxResult.error();
diff --git a/src/main/java/com/ruoyi/dto/PageDto.java b/src/main/java/com/ruoyi/dto/PageDto.java
new file mode 100644
index 0000000..7c6f399
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/equipmentenergyconsumption/controller/ElectricityConsumptionAreaController.java b/src/main/java/com/ruoyi/equipmentenergyconsumption/controller/ElectricityConsumptionAreaController.java
new file mode 100644
index 0000000..e6babfe
--- /dev/null
+++ b/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();
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/equipmentenergyconsumption/controller/EnergyPeriodController.java b/src/main/java/com/ruoyi/equipmentenergyconsumption/controller/EnergyPeriodController.java
new file mode 100644
index 0000000..1c4842f
--- /dev/null
+++ b/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() , "鐢ㄧ數鏃舵鏁版嵁");
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/equipmentenergyconsumption/controller/EquipmentEnergyConsumptionController.java b/src/main/java/com/ruoyi/equipmentenergyconsumption/controller/EquipmentEnergyConsumptionController.java
index 5dc5686..e71fe31 100644
--- a/src/main/java/com/ruoyi/equipmentenergyconsumption/controller/EquipmentEnergyConsumptionController.java
+++ b/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 , "瀹㈡埛妗f鏁版嵁");
+        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 , "瀵煎嚭鑳芥簮瓒嬪娍");
+    }
+
 
 
 }
diff --git a/src/main/java/com/ruoyi/equipmentenergyconsumption/dto/ElectricityConsumptionAreaTreeDto.java b/src/main/java/com/ruoyi/equipmentenergyconsumption/dto/ElectricityConsumptionAreaTreeDto.java
new file mode 100644
index 0000000..b481090
--- /dev/null
+++ b/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;
+
+}
diff --git a/src/main/java/com/ruoyi/equipmentenergyconsumption/dto/EquipmentEnergyConsumptionDto.java b/src/main/java/com/ruoyi/equipmentenergyconsumption/dto/EquipmentEnergyConsumptionDto.java
new file mode 100644
index 0000000..15689d0
--- /dev/null
+++ b/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;
+
+
+}
diff --git a/src/main/java/com/ruoyi/equipmentenergyconsumption/mapper/ElectricityConsumptionAreaMapper.java b/src/main/java/com/ruoyi/equipmentenergyconsumption/mapper/ElectricityConsumptionAreaMapper.java
new file mode 100644
index 0000000..337ae70
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/equipmentenergyconsumption/mapper/EnergyPeriodMapper.java b/src/main/java/com/ruoyi/equipmentenergyconsumption/mapper/EnergyPeriodMapper.java
new file mode 100644
index 0000000..468c7c0
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/equipmentenergyconsumption/pojo/ElectricityConsumptionArea.java b/src/main/java/com/ruoyi/equipmentenergyconsumption/pojo/ElectricityConsumptionArea.java
new file mode 100644
index 0000000..4911305
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/equipmentenergyconsumption/pojo/EnergyPeriod.java b/src/main/java/com/ruoyi/equipmentenergyconsumption/pojo/EnergyPeriod.java
new file mode 100644
index 0000000..20c9e8f
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/equipmentenergyconsumption/pojo/EquipmentEnergyConsumption.java b/src/main/java/com/ruoyi/equipmentenergyconsumption/pojo/EquipmentEnergyConsumption.java
index c6562aa..846fc8a 100644
--- a/src/main/java/com/ruoyi/equipmentenergyconsumption/pojo/EquipmentEnergyConsumption.java
+++ b/src/main/java/com/ruoyi/equipmentenergyconsumption/pojo/EquipmentEnergyConsumption.java
@@ -135,5 +135,8 @@
      */
     @TableField(fill = FieldFill.INSERT)
     private Long tenantId;
-
+    /**
+     *鎵�灞炵敤鐢靛尯鍩焛d
+     */
+    private Long electricityConsumptionAreaId;
 }
diff --git a/src/main/java/com/ruoyi/equipmentenergyconsumption/service/ElectricityConsumptionAreaService.java b/src/main/java/com/ruoyi/equipmentenergyconsumption/service/ElectricityConsumptionAreaService.java
new file mode 100644
index 0000000..87c4e0d
--- /dev/null
+++ b/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();
+}
diff --git a/src/main/java/com/ruoyi/equipmentenergyconsumption/service/EnergyPeriodService.java b/src/main/java/com/ruoyi/equipmentenergyconsumption/service/EnergyPeriodService.java
new file mode 100644
index 0000000..9da49fb
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/equipmentenergyconsumption/service/impl/ElectricityConsumptionAreaServiceImpl.java b/src/main/java/com/ruoyi/equipmentenergyconsumption/service/impl/ElectricityConsumptionAreaServiceImpl.java
new file mode 100644
index 0000000..abccda9
--- /dev/null
+++ b/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;
+    }
+}
diff --git a/src/main/java/com/ruoyi/equipmentenergyconsumption/service/impl/EnergyPeriodServiceImpl.java b/src/main/java/com/ruoyi/equipmentenergyconsumption/service/impl/EnergyPeriodServiceImpl.java
new file mode 100644
index 0000000..4eabf91
--- /dev/null
+++ b/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;
+    }
+}
diff --git a/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java b/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java
index d84b370..ccf8d65 100644
--- a/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java
+++ b/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java
@@ -63,8 +63,8 @@
                 .build()
                 /* 璁剧疆瀹夊叏妯″紡锛宻wagger鍙互璁剧疆璁块棶token */
                 .securitySchemes(securitySchemes())
-                .securityContexts(securityContexts())
-                .pathMapping(pathMapping);
+                .securityContexts(securityContexts());
+//                .pathMapping(pathMapping);
     }
 
     /**
diff --git a/src/main/java/com/ruoyi/home/controller/HomeController.java b/src/main/java/com/ruoyi/home/controller/HomeController.java
index 137b4b8..d0af0b5 100644
--- a/src/main/java/com/ruoyi/home/controller/HomeController.java
+++ b/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);
     }
diff --git a/src/main/java/com/ruoyi/home/service/HomeService.java b/src/main/java/com/ruoyi/home/service/HomeService.java
index 49e7530..1902488 100644
--- a/src/main/java/com/ruoyi/home/service/HomeService.java
+++ b/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);
 }
diff --git a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
index 606388c..ad6ca2f 100644
--- a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
+++ b/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);
 
diff --git a/src/main/java/com/ruoyi/inspectiontask/StorageAttachmentRecordType.java b/src/main/java/com/ruoyi/inspectiontask/StorageAttachmentRecordType.java
new file mode 100644
index 0000000..e15b741
--- /dev/null
+++ b/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;
+
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/controller/InspectionTaskController.java b/src/main/java/com/ruoyi/inspectiontask/controller/InspectionTaskController.java
new file mode 100644
index 0000000..ce8e057
--- /dev/null
+++ b/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));
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/controller/QrCodeController.java b/src/main/java/com/ruoyi/inspectiontask/controller/QrCodeController.java
new file mode 100644
index 0000000..3d35be5
--- /dev/null
+++ b/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));
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/controller/QrCodeScanRecordController.java b/src/main/java/com/ruoyi/inspectiontask/controller/QrCodeScanRecordController.java
new file mode 100644
index 0000000..00329b6
--- /dev/null
+++ b/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));
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/controller/TimingTaskController.java b/src/main/java/com/ruoyi/inspectiontask/controller/TimingTaskController.java
new file mode 100644
index 0000000..e802ccc
--- /dev/null
+++ b/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));
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/dto/InspectionTaskDto.java b/src/main/java/com/ruoyi/inspectiontask/dto/InspectionTaskDto.java
new file mode 100644
index 0000000..f92bde5
--- /dev/null
+++ b/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;
+
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/dto/QrCodeDto.java b/src/main/java/com/ruoyi/inspectiontask/dto/QrCodeDto.java
new file mode 100644
index 0000000..2badd86
--- /dev/null
+++ b/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 {
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/dto/QrCodeScanRecordDto.java b/src/main/java/com/ruoyi/inspectiontask/dto/QrCodeScanRecordDto.java
new file mode 100644
index 0000000..4247330
--- /dev/null
+++ b/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;
+
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/dto/TimingTaskDto.java b/src/main/java/com/ruoyi/inspectiontask/dto/TimingTaskDto.java
new file mode 100644
index 0000000..ad26f89
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/mapper/InspectionTaskMapper.java b/src/main/java/com/ruoyi/inspectiontask/mapper/InspectionTaskMapper.java
new file mode 100644
index 0000000..9c79059
--- /dev/null
+++ b/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> {
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/mapper/QrCodeMapper.java b/src/main/java/com/ruoyi/inspectiontask/mapper/QrCodeMapper.java
new file mode 100644
index 0000000..e2a9c6b
--- /dev/null
+++ b/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> {
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/mapper/QrCodeScanRecordMapper.java b/src/main/java/com/ruoyi/inspectiontask/mapper/QrCodeScanRecordMapper.java
new file mode 100644
index 0000000..595a1f5
--- /dev/null
+++ b/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> {
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/mapper/TimingTaskMapper.java b/src/main/java/com/ruoyi/inspectiontask/mapper/TimingTaskMapper.java
new file mode 100644
index 0000000..13a011b
--- /dev/null
+++ b/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);
+
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/pojo/InspectionTask.java b/src/main/java/com/ruoyi/inspectiontask/pojo/InspectionTask.java
new file mode 100644
index 0000000..d6fc797
--- /dev/null
+++ b/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 = "宸℃浜篒D")
+    private String inspectorId;
+
+    @ApiModelProperty(value = "鎵ц宸℃鐨勪汉鍛樺鍚�")
+    @Excel(name = "鎵ц宸℃浜哄憳")
+    private String inspector;
+
+    @ApiModelProperty(value = "浠诲姟闄勫姞璇存槑鎴栫壒娈婃儏鍐佃褰�")
+    @Excel(name = "澶囨敞")
+    private String remarks;
+
+    @ApiModelProperty(value = "浠诲姟鐧昏浜篒D")
+    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;
+
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/pojo/QrCode.java b/src/main/java/com/ruoyi/inspectiontask/pojo/QrCode.java
new file mode 100644
index 0000000..2065e2e
--- /dev/null
+++ b/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;
+
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/pojo/QrCodeScanRecord.java b/src/main/java/com/ruoyi/inspectiontask/pojo/QrCodeScanRecord.java
new file mode 100644
index 0000000..2c1e3fe
--- /dev/null
+++ b/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 = "鎵爜浜虹敤鎴稩D")
+    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;
+
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/pojo/TimingTask.java b/src/main/java/com/ruoyi/inspectiontask/pojo/TimingTask.java
new file mode 100644
index 0000000..8d03b06
--- /dev/null
+++ b/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 = "鐧昏浜篿d")
+    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;
+
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/service/InspectionTaskService.java b/src/main/java/com/ruoyi/inspectiontask/service/InspectionTaskService.java
new file mode 100644
index 0000000..de175f2
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/service/QrCodeScanRecordService.java b/src/main/java/com/ruoyi/inspectiontask/service/QrCodeScanRecordService.java
new file mode 100644
index 0000000..8d3cbab
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/service/QrCodeService.java b/src/main/java/com/ruoyi/inspectiontask/service/QrCodeService.java
new file mode 100644
index 0000000..0eeecd2
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/service/TimingTaskService.java b/src/main/java/com/ruoyi/inspectiontask/service/TimingTaskService.java
new file mode 100644
index 0000000..8d00032
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java
new file mode 100644
index 0000000..6439f69
--- /dev/null
+++ b/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());
+        //鐧昏浜篿ds
+        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<>();
+        }
+        //宸℃浜篿ds
+        List<String> inspectorIds = entityPage.getRecords().stream().map(InspectionTask::getInspectorId).collect(Collectors.toList());
+
+        //鑾峰彇鎵�鏈変笉閲嶅鐨勭敤鎴稩D
+        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));
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/QrCodeScanRecordServiceImpl.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/QrCodeScanRecordServiceImpl.java
new file mode 100644
index 0000000..5ac3038
--- /dev/null
+++ b/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. 鎵归噺鑾峰彇鎵�鏈夎褰旾D鍜屼簩缁寸爜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. 鎵归噺鏌ヨ鍏宠仈鏁版嵁锛堜娇鐢ㄦ渶鏂癆PI锛�
+        // 5.1 鏌ヨ浜岀淮鐮佷俊鎭紙鏇挎崲selectBatchIds涓簊electByIds锛�
+        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 鏌ヨ鏂囦欢鏁版嵁锛堜娇鐢╯electByIds锛�
+        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));
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/QrCodeServiceImpl.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/QrCodeServiceImpl.java
new file mode 100644
index 0000000..e88a5d1
--- /dev/null
+++ b/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));
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/QuartzConfig.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/QuartzConfig.java
new file mode 100644
index 0000000..da332f1
--- /dev/null
+++ b/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锛岀敤浜庢敮鎸丣ob涓殑渚濊禆娉ㄥ叆
+        AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
+        jobFactory.setApplicationContext(applicationContext);
+        schedulerFactory.setJobFactory(jobFactory);
+
+        // 鍏朵粬閰嶇疆...
+        return schedulerFactory;
+    }
+
+    // 鑷畾涔塉obFactory锛屾敮鎸佽嚜鍔ㄦ敞鍏�
+    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);
+            // 灏咼ob瀹炰緥浜ょ粰Spring瀹瑰櫒绠$悊锛屼娇鍏惰兘澶熻繘琛屼緷璧栨敞鍏�
+            beanFactory.autowireBean(jobInstance);
+            return jobInstance;
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/SpringContextHolder.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/SpringContextHolder.java
new file mode 100644
index 0000000..e245130
--- /dev/null
+++ b/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);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskJob.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskJob.java
new file mode 100644
index 0000000..1cfc748
--- /dev/null
+++ b/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 // 绂佹骞跺彂鎵ц鍚屼竴涓狫ob
+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();
+        // 淇绫诲瀷杞崲閿欒锛屾纭幏鍙杢askId
+        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("鑷姩鐢熸垚鑷畾鏃朵换鍔D: " + 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); // 瑙f瀽鏍煎紡 "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]); // 鏃堕棿閮ㄥ垎
+
+        // 瑙f瀽鏄熸湡鍑�(鏀寔澶氫釜鏄熸湡)
+        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]);
+
+        // 璁$畻褰撳墠瀛e害
+        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 {
+            // 闇�瑕佸埌涓嬩釜瀛e害
+            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()
+        );
+    }
+
+    /**
+     * 瑙f瀽鏄熸湡鍑犲瓧绗︿覆
+     */
+    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;
+    }
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java
new file mode 100644
index 0000000..34d1467
--- /dev/null
+++ b/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]);  // 瑙f瀽鏃堕棿
+
+        // 璁$畻瀛e害璧峰鏈堜唤(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("鏃堕棿鏍煎紡蹇呴』涓篐H: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("瀛e害鏈堜唤蹇呴』鏄�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);
+        }
+    }
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
new file mode 100644
index 0000000..33c815e
--- /dev/null
+++ b/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<>();
+
+        // 鏀堕泦鐧昏浜篒D
+        taskPage.getRecords().forEach(task -> {
+            if (task.getRegistrantId() != null) {
+                userIds.add(task.getRegistrantId());
+            }
+        });
+
+        // 鏀堕泦宸℃浜篒D锛堝涓狪D浠ラ�楀彿鍒嗛殧锛�
+        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. 杞崲涓篋TO
+        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) {
+        // 瑙f瀽杈撳叆鍙傛暟
+        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);
+        }
+
+        // 瑙f瀽鏃堕棿
+        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) {
+        // 瑙f瀽杈撳叆鍙傛暟
+        String[] parts = frequencyDetail.split(",");
+        if (parts.length != 2) {
+            throw new IllegalArgumentException("鍙傛暟鏍煎紡閿欒锛屽簲涓�'03,17:00'鏍煎紡");
+        }
+
+        String dayStr = parts[0].trim();
+        String timeStr = parts[1].trim();
+
+        // 瑙f瀽鏃ユ湡
+        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);
+        }
+
+        // 瑙f瀽鏃堕棿
+        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) {
+                // 姝g‘鑾峰彇涓嬩釜鏈堢殑鏈�鍚庝竴澶╋紙淇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); // 瑙f瀽鏍煎紡 "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]); // 鏃堕棿閮ㄥ垎
+
+        // 瑙f瀽鏄熸湡鍑�(鏀寔澶氫釜鏄熸湡)
+        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]);
+
+        // 璁$畻褰撳墠瀛e害
+        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 {
+            // 闇�瑕佸埌涓嬩釜瀛e害
+            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()
+        );
+    }
+
+    /**
+     * 瑙f瀽鏄熸湡鍑犲瓧绗︿覆
+     */
+    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));
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/lavorissue/controller/LavorIssueController.java b/src/main/java/com/ruoyi/lavorissue/controller/LavorIssueController.java
new file mode 100644
index 0000000..f0c861a
--- /dev/null
+++ b/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);
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/lavorissue/dto/StatisticsLaborIssue.java b/src/main/java/com/ruoyi/lavorissue/dto/StatisticsLaborIssue.java
new file mode 100644
index 0000000..7e7a4a2
--- /dev/null
+++ b/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;
+
+}
diff --git a/src/main/java/com/ruoyi/lavorissue/mapper/LavorIssueMapper.java b/src/main/java/com/ruoyi/lavorissue/mapper/LavorIssueMapper.java
new file mode 100644
index 0000000..8fa8999
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/lavorissue/pojo/LaborIssue.java b/src/main/java/com/ruoyi/lavorissue/pojo/LaborIssue.java
new file mode 100644
index 0000000..3994833
--- /dev/null
+++ b/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;
+
+}
diff --git a/src/main/java/com/ruoyi/lavorissue/service/LavorIssueService.java b/src/main/java/com/ruoyi/lavorissue/service/LavorIssueService.java
new file mode 100644
index 0000000..a0fd247
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/lavorissue/service/impl/LavorIssueServiceImpl.java b/src/main/java/com/ruoyi/lavorissue/service/impl/LavorIssueServiceImpl.java
new file mode 100644
index 0000000..9e66121
--- /dev/null
+++ b/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);
+
+        // 浣跨敤鍙彉鐨凙rrayList鏇挎崲榛樿鐨勪笉鍙彉鍒楄〃
+        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鍙互闃叉涓枃涔辩爜 褰撶劧鍜宔asyexcel娌℃湁鍏崇郴
+        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();
+                //鍚憇heet0鍐欏叆鏁版嵁 浼犲叆绌簂ist杩欐牱鍙鍑鸿〃澶�
+                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); // 璁剧疆浼犲叆鐨凞ate
+        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); // 璁剧疆浼犲叆鐨凞ate
+        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH)); // 璁剧疆涓哄綋鏈堢涓�澶�
+        return calendar.getTime(); // 杩斿洖Date瀵硅薄
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsController.java b/src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsController.java
new file mode 100644
index 0000000..866636b
--- /dev/null
+++ b/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));
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/dto/SparePartsDto.java b/src/main/java/com/ruoyi/measuringinstrumentledger/dto/SparePartsDto.java
new file mode 100644
index 0000000..cf9ac86
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/mapper/SparePartsMapper.java b/src/main/java/com/ruoyi/measuringinstrumentledger/mapper/SparePartsMapper.java
new file mode 100644
index 0000000..fa52570
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/pojo/SpareParts.java b/src/main/java/com/ruoyi/measuringinstrumentledger/pojo/SpareParts.java
new file mode 100644
index 0000000..21117bd
--- /dev/null
+++ b/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;
+    /**
+     * 澶囦欢鐖秈d
+     */
+    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;
+}
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/service/SparePartsService.java b/src/main/java/com/ruoyi/measuringinstrumentledger/service/SparePartsService.java
new file mode 100644
index 0000000..6185db4
--- /dev/null
+++ b/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();
+}
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/MeasuringInstrumentLedgerRecordServiceImpl.java b/src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/MeasuringInstrumentLedgerRecordServiceImpl.java
index e9b191c..88e3bbc 100644
--- a/src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/MeasuringInstrumentLedgerRecordServiceImpl.java
+++ b/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锛�
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/MeasuringInstrumentLedgerServiceImpl.java b/src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/MeasuringInstrumentLedgerServiceImpl.java
index c59f3c1..72ce890 100644
--- a/src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/MeasuringInstrumentLedgerServiceImpl.java
+++ b/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锛�
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/SparePartsServiceImpl.java b/src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/SparePartsServiceImpl.java
new file mode 100644
index 0000000..8660237
--- /dev/null
+++ b/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;
+    }
+}
diff --git a/src/main/java/com/ruoyi/oA/controller/OaProjectController.java b/src/main/java/com/ruoyi/oA/controller/OaProjectController.java
new file mode 100644
index 0000000..8862fb5
--- /dev/null
+++ b/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);
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/oA/controller/OaProjectPhaseController.java b/src/main/java/com/ruoyi/oA/controller/OaProjectPhaseController.java
new file mode 100644
index 0000000..d857f52
--- /dev/null
+++ b/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));
+    }
+}
diff --git a/src/main/java/com/ruoyi/oA/controller/OaProjectPhaseTaskController.java b/src/main/java/com/ruoyi/oA/controller/OaProjectPhaseTaskController.java
new file mode 100644
index 0000000..c0f7fc1
--- /dev/null
+++ b/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));
+    }
+}
diff --git a/src/main/java/com/ruoyi/oA/dto/OaProjectDto.java b/src/main/java/com/ruoyi/oA/dto/OaProjectDto.java
new file mode 100644
index 0000000..0f90faf
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/oA/dto/OaProjectPhaseDto.java b/src/main/java/com/ruoyi/oA/dto/OaProjectPhaseDto.java
new file mode 100644
index 0000000..4ef163e
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/oA/mapper/OaProjectMapper.java b/src/main/java/com/ruoyi/oA/mapper/OaProjectMapper.java
new file mode 100644
index 0000000..2114cef
--- /dev/null
+++ b/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 閽堝琛ㄣ�恛a_project(OA绯荤粺-椤圭洰浠诲姟鍗忓悓-椤圭洰琛�)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @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);
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/oA/mapper/OaProjectPhaseMapper.java b/src/main/java/com/ruoyi/oA/mapper/OaProjectPhaseMapper.java
new file mode 100644
index 0000000..41f6ab0
--- /dev/null
+++ b/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 閽堝琛ㄣ�恛a_project_phase(OA绯荤粺-椤圭洰闃舵琛�)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @createDate 2025-09-24 09:18:46
+* @Entity com.ruoyi.oA.pojo.OaProjectPhase
+*/
+public interface OaProjectPhaseMapper extends BaseMapper<OaProjectPhase> {
+
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/oA/mapper/OaProjectPhaseTaskMapper.java b/src/main/java/com/ruoyi/oA/mapper/OaProjectPhaseTaskMapper.java
new file mode 100644
index 0000000..b357c76
--- /dev/null
+++ b/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 閽堝琛ㄣ�恛a_project_phase_task(OA绯荤粺-椤圭洰闃舵-浠诲姟琛�)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @createDate 2025-09-24 09:18:46
+* @Entity com.ruoyi.oA.pojo.OaProjectPhaseTask
+*/
+public interface OaProjectPhaseTaskMapper extends BaseMapper<OaProjectPhaseTask> {
+
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/oA/pojo/OaProject.java b/src/main/java/com/ruoyi/oA/pojo/OaProject.java
new file mode 100644
index 0000000..376f58f
--- /dev/null
+++ b/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;
+
+    /**
+     * 璐熻矗浜篿d
+     */
+    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;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/oA/pojo/OaProjectPhase.java b/src/main/java/com/ruoyi/oA/pojo/OaProjectPhase.java
new file mode 100644
index 0000000..04326ed
--- /dev/null
+++ b/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琛╥d
+     */
+    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;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/oA/pojo/OaProjectPhaseTask.java b/src/main/java/com/ruoyi/oA/pojo/OaProjectPhaseTask.java
new file mode 100644
index 0000000..8241ce5
--- /dev/null
+++ b/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琛╥d
+     */
+    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;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/oA/service/OaProjectPhaseService.java b/src/main/java/com/ruoyi/oA/service/OaProjectPhaseService.java
new file mode 100644
index 0000000..7914080
--- /dev/null
+++ b/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 閽堝琛ㄣ�恛a_project_phase(OA绯荤粺-椤圭洰闃舵琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice
+* @createDate 2025-09-24 09:18:46
+*/
+public interface OaProjectPhaseService extends IService<OaProjectPhase> {
+
+    List<OaProjectPhaseDto> listByProjectId(Integer oaProjectId);
+
+    boolean deleteById(Integer phaseId);
+}
diff --git a/src/main/java/com/ruoyi/oA/service/OaProjectPhaseTaskService.java b/src/main/java/com/ruoyi/oA/service/OaProjectPhaseTaskService.java
new file mode 100644
index 0000000..225d12e
--- /dev/null
+++ b/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 閽堝琛ㄣ�恛a_project_phase_task(OA绯荤粺-椤圭洰闃舵-浠诲姟琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice
+* @createDate 2025-09-24 09:18:46
+*/
+public interface OaProjectPhaseTaskService extends IService<OaProjectPhaseTask> {
+
+    List<OaProjectPhaseTask> listByPhaseId(Integer phaseId);
+}
diff --git a/src/main/java/com/ruoyi/oA/service/OaProjectService.java b/src/main/java/com/ruoyi/oA/service/OaProjectService.java
new file mode 100644
index 0000000..32ba593
--- /dev/null
+++ b/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 閽堝琛ㄣ�恛a_project(OA绯荤粺-椤圭洰浠诲姟鍗忓悓-椤圭洰琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice
+* @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);
+}
diff --git a/src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseServiceImpl.java b/src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseServiceImpl.java
new file mode 100644
index 0000000..b462f36
--- /dev/null
+++ b/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 閽堝琛ㄣ�恛a_project_phase(OA绯荤粺-椤圭洰闃舵琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+* @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;
+    }
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseTaskServiceImpl.java b/src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseTaskServiceImpl.java
new file mode 100644
index 0000000..625e8d8
--- /dev/null
+++ b/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 閽堝琛ㄣ�恛a_project_phase_task(OA绯荤粺-椤圭洰闃舵-浠诲姟琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+* @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));
+    }
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/oA/service/impl/OaProjectServiceImpl.java b/src/main/java/com/ruoyi/oA/service/impl/OaProjectServiceImpl.java
new file mode 100644
index 0000000..149c04f
--- /dev/null
+++ b/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 閽堝琛ㄣ�恛a_project(OA绯荤粺-椤圭洰浠诲姟鍗忓悓-椤圭洰琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+* @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;
+    }
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/officesupplies/controller/OfficeSuppliesController.java b/src/main/java/com/ruoyi/officesupplies/controller/OfficeSuppliesController.java
new file mode 100644
index 0000000..91243f4
--- /dev/null
+++ b/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("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        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 , "鍔炲叕鐗╄祫");
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/officesupplies/mapper/OfficeSuppliesMapper.java b/src/main/java/com/ruoyi/officesupplies/mapper/OfficeSuppliesMapper.java
new file mode 100644
index 0000000..7d73636
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/officesupplies/pojo/OfficeSupplies.java b/src/main/java/com/ruoyi/officesupplies/pojo/OfficeSupplies.java
new file mode 100644
index 0000000..b693c10
--- /dev/null
+++ b/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;
+
+}
diff --git a/src/main/java/com/ruoyi/officesupplies/service/OfficeSuppliesService.java b/src/main/java/com/ruoyi/officesupplies/service/OfficeSuppliesService.java
new file mode 100644
index 0000000..3a521b5
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/officesupplies/service/impl/OfficeSuppliesServiceImpl.java b/src/main/java/com/ruoyi/officesupplies/service/impl/OfficeSuppliesServiceImpl.java
new file mode 100644
index 0000000..2ba961f
--- /dev/null
+++ b/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);
+    }
+}
diff --git a/src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java b/src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java
index d43adf0..40098d5 100644
--- a/src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java
+++ b/src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java
@@ -85,6 +85,7 @@
      *
      * @param businessId  涓氬姟ID锛堥攢鍞彴璐D锛�
      * @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锛�
diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/GasTankWarningController.java b/src/main/java/com/ruoyi/procurementrecord/controller/GasTankWarningController.java
new file mode 100644
index 0000000..7646478
--- /dev/null
+++ b/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("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        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);
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/InboundManagementController.java b/src/main/java/com/ruoyi/procurementrecord/controller/InboundManagementController.java
new file mode 100644
index 0000000..b8ffa23
--- /dev/null
+++ b/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();
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPlanController.java b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPlanController.java
new file mode 100644
index 0000000..64d9dc8
--- /dev/null
+++ b/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);
+    }
+
+
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPriceManagementController.java b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPriceManagementController.java
new file mode 100644
index 0000000..9135b7b
--- /dev/null
+++ b/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("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        }
+        boolean result = procurementPriceManagementService.removeByIds(ids);
+        return result ? AjaxResult.success() : AjaxResult.error();
+    }
+
+    /**
+     * 瀵煎嚭
+     * @param response
+     */
+    @PostMapping("/export")
+    public void export(HttpServletResponse response) {
+        procurementPriceManagementService.export(response);
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
index a106fb2..7fb7b44 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
+++ b/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));
+    }
 
     /**
      * 瀵煎嚭
diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/ReturnManagementController.java b/src/main/java/com/ruoyi/procurementrecord/controller/ReturnManagementController.java
new file mode 100644
index 0000000..3cb1e59
--- /dev/null
+++ b/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();
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/Details.java b/src/main/java/com/ruoyi/procurementrecord/dto/Details.java
index 510b62d..b2e5a21 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/Details.java
+++ b/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;
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java
index 63ce258..d8004b4 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java
+++ b/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 = "寰呭叆搴撴暟閲�")
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java
index ae93d84..0356de7 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java
+++ b/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;
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
index 51ad7bd..4f3f260 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
+++ b/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;
 
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java
index 9ef5677..9592ad1 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java
+++ b/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;
 
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java
index 3dd180e..55ceb9c 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java
+++ b/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;
 
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementUpdateDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementUpdateDto.java
index 153884e..82e02f1 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementUpdateDto.java
+++ b/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;
diff --git a/src/main/java/com/ruoyi/procurementrecord/mapper/GasTankWarningMapper.java b/src/main/java/com/ruoyi/procurementrecord/mapper/GasTankWarningMapper.java
new file mode 100644
index 0000000..aab09cb
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/mapper/InboundManagementMapper.java b/src/main/java/com/ruoyi/procurementrecord/mapper/InboundManagementMapper.java
new file mode 100644
index 0000000..2496b23
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementPlanMapper.java b/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementPlanMapper.java
new file mode 100644
index 0000000..2745574
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementPriceManagementMapper.java b/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementPriceManagementMapper.java
new file mode 100644
index 0000000..36b274c
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/mapper/ReturnManagementMapper.java b/src/main/java/com/ruoyi/procurementrecord/mapper/ReturnManagementMapper.java
new file mode 100644
index 0000000..14953ad
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/GasTankWarning.java b/src/main/java/com/ruoyi/procurementrecord/pojo/GasTankWarning.java
new file mode 100644
index 0000000..4f95872
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/InboundManagement.java b/src/main/java/com/ruoyi/procurementrecord/pojo/InboundManagement.java
new file mode 100644
index 0000000..56f322e
--- /dev/null
+++ b/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;
+
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementPlan.java b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementPlan.java
new file mode 100644
index 0000000..56892a3
--- /dev/null
+++ b/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;
+
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementPriceManagement.java b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementPriceManagement.java
new file mode 100644
index 0000000..08c9d21
--- /dev/null
+++ b/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;
+
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
index d169692..b09b0f3 100644
--- a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
+++ b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
@@ -31,6 +31,12 @@
      */
     private Integer procurementRecordStorageId;
 
+
+    /**
+     * 缂栧彿
+     */
+    private String code;
+
     /**
      * 鍑哄簱鎵规
      */
diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
index 495a8a6..28cee3c 100644
--- a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
+++ b/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
      */
diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/ReturnManagement.java b/src/main/java/com/ruoyi/procurementrecord/pojo/ReturnManagement.java
new file mode 100644
index 0000000..54091ab
--- /dev/null
+++ b/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;
+
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/GasTankWarningService.java b/src/main/java/com/ruoyi/procurementrecord/service/GasTankWarningService.java
new file mode 100644
index 0000000..912fb3c
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/InboundManagementService.java b/src/main/java/com/ruoyi/procurementrecord/service/InboundManagementService.java
new file mode 100644
index 0000000..bd620a6
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementPlanService.java b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementPlanService.java
new file mode 100644
index 0000000..e96dbe6
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementPriceManagementService.java b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementPriceManagementService.java
new file mode 100644
index 0000000..fc26ab6
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
index c7e1699..79603ae 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
+++ b/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);
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/ReturnManagementService.java b/src/main/java/com/ruoyi/procurementrecord/service/ReturnManagementService.java
new file mode 100644
index 0000000..b35be31
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/GasTankWarningServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/GasTankWarningServiceImpl.java
new file mode 100644
index 0000000..772869b
--- /dev/null
+++ b/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");
+    }
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/InboundManagementServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/InboundManagementServiceImpl.java
new file mode 100644
index 0000000..5e8fa72
--- /dev/null
+++ b/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;
+    }
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPlanServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPlanServiceImpl.java
new file mode 100644
index 0000000..81216db
--- /dev/null
+++ b/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, "閲囪喘璁″垝");
+    }
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPriceManagementServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPriceManagementServiceImpl.java
new file mode 100644
index 0000000..e90a7a2
--- /dev/null
+++ b/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, "閲囪喘浠锋牸绠$悊");}
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
index 31605d7..29cba69 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
+++ b/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()))
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
index 06612f6..1675069 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
+++ b/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));
         }
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnManagementServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnManagementServiceImpl.java
new file mode 100644
index 0000000..ef3f242
--- /dev/null
+++ b/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;
+    }
+}
diff --git a/src/main/java/com/ruoyi/production/controller/SalesLedgerSchedulingController.java b/src/main/java/com/ruoyi/production/controller/SalesLedgerSchedulingController.java
index 22b96b4..5ca3bc2 100644
--- a/src/main/java/com/ruoyi/production/controller/SalesLedgerSchedulingController.java
+++ b/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)
diff --git a/src/main/java/com/ruoyi/production/controller/SalesLedgerWorkController.java b/src/main/java/com/ruoyi/production/controller/SalesLedgerWorkController.java
index 866970e..4051ecf 100644
--- a/src/main/java/com/ruoyi/production/controller/SalesLedgerWorkController.java
+++ b/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("鐢熶骇鎶ュ伐-鏌ヨ")
diff --git a/src/main/java/com/ruoyi/production/dto/DaiDto.java b/src/main/java/com/ruoyi/production/dto/DaiDto.java
new file mode 100644
index 0000000..86853cb
--- /dev/null
+++ b/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 = "閿�鍞骇鍝両D")
+    private Long salesLedgerProductId;
+
+    @ApiModelProperty(value = "閿�鍞彴璐D")
+    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;
+
+}
diff --git a/src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingDto.java b/src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingDto.java
index accffb0..4e606a1 100644
--- a/src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingDto.java
+++ b/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;
 
diff --git a/src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingProcessDto.java b/src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingProcessDto.java
index 45e6148..8952455 100644
--- a/src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingProcessDto.java
+++ b/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;
diff --git a/src/main/java/com/ruoyi/production/dto/SalesLedgerWorkDto.java b/src/main/java/com/ruoyi/production/dto/SalesLedgerWorkDto.java
index a241cca..055f2a8 100644
--- a/src/main/java/com/ruoyi/production/dto/SalesLedgerWorkDto.java
+++ b/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;
+
+
 }
diff --git a/src/main/java/com/ruoyi/production/service/SalesLedgerSchedulingService.java b/src/main/java/com/ruoyi/production/service/SalesLedgerSchedulingService.java
index 484bd23..2387e87 100644
--- a/src/main/java/com/ruoyi/production/service/SalesLedgerSchedulingService.java
+++ b/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);
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java
index 103d809..4f60b7e 100644
--- a/src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java
+++ b/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, "鐢熶骇娲惧伐");
+    }
 }
diff --git a/src/main/java/com/ruoyi/project/common/CommonController.java b/src/main/java/com/ruoyi/project/common/CommonController.java
index c575425..21fa5ec 100644
--- a/src/main/java/com/ruoyi/project/common/CommonController.java
+++ b/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));
+    }
+
     /**
      * 閫氱敤涓婁紶璇锋眰锛堝崟涓級
      */
diff --git a/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java b/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java
index 9f7003a..550fa51 100644
--- a/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java
+++ b/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);
 }
diff --git a/src/main/java/com/ruoyi/purchase/controller/AccountingReportController.java b/src/main/java/com/ruoyi/purchase/controller/AccountingReportController.java
index 5f62c97..3df034f 100644
--- a/src/main/java/com/ruoyi/purchase/controller/AccountingReportController.java
+++ b/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() , "澧炲�肩◣姣斿");
+    }
 }
diff --git a/src/main/java/com/ruoyi/purchase/controller/PaymentRegistrationController.java b/src/main/java/com/ruoyi/purchase/controller/PaymentRegistrationController.java
index 93bca78..71f1b5d 100644
--- a/src/main/java/com/ruoyi/purchase/controller/PaymentRegistrationController.java
+++ b/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(), "瀵煎嚭浠樻娴佹按鍒楄〃");
+    }
 
     /**
      * 鑾峰彇浠樻鐧昏璇︾粏淇℃伅
diff --git a/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java b/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
index 21a601e..fca4277 100644
--- a/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
+++ b/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)
diff --git a/src/main/java/com/ruoyi/purchase/controller/TicketRegistrationController.java b/src/main/java/com/ruoyi/purchase/controller/TicketRegistrationController.java
index ab38808..d4fd91b 100644
--- a/src/main/java/com/ruoyi/purchase/controller/TicketRegistrationController.java
+++ b/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")
diff --git a/src/main/java/com/ruoyi/purchase/dto/InvoicePurchaseReportDto.java b/src/main/java/com/ruoyi/purchase/dto/InvoicePurchaseReportDto.java
index f9b8657..45347ad 100644
--- a/src/main/java/com/ruoyi/purchase/dto/InvoicePurchaseReportDto.java
+++ b/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;
 
 }
diff --git a/src/main/java/com/ruoyi/purchase/dto/PaymentRegistrationDto.java b/src/main/java/com/ruoyi/purchase/dto/PaymentRegistrationDto.java
index 0ba914a..2561c8d 100644
--- a/src/main/java/com/ruoyi/purchase/dto/PaymentRegistrationDto.java
+++ b/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;
 
     // 鍙戠エ鍙�
diff --git a/src/main/java/com/ruoyi/purchase/dto/ProductRecordDto.java b/src/main/java/com/ruoyi/purchase/dto/ProductRecordDto.java
index 1a3396d..25085d2 100644
--- a/src/main/java/com/ruoyi/purchase/dto/ProductRecordDto.java
+++ b/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;
     //澧炲�肩◣
diff --git a/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java b/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
index d0d3de6..7d1e9e5 100644
--- a/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
+++ b/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")
diff --git a/src/main/java/com/ruoyi/purchase/dto/VatDto.java b/src/main/java/com/ruoyi/purchase/dto/VatDto.java
index 8eb273a..c70ebeb 100644
--- a/src/main/java/com/ruoyi/purchase/dto/VatDto.java
+++ b/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;
 
 }
diff --git a/src/main/java/com/ruoyi/purchase/pojo/PaymentRegistration.java b/src/main/java/com/ruoyi/purchase/pojo/PaymentRegistration.java
index d117038..91f0540 100644
--- a/src/main/java/com/ruoyi/purchase/pojo/PaymentRegistration.java
+++ b/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;
 
     /**
diff --git a/src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java b/src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java
index c0fcb50..7b7ad72 100644
--- a/src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java
+++ b/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;
+
     /**
      * 澶囨敞
      */
diff --git a/src/main/java/com/ruoyi/purchase/pojo/TicketRegistration.java b/src/main/java/com/ruoyi/purchase/pojo/TicketRegistration.java
index 47bb1f9..e79796a 100644
--- a/src/main/java/com/ruoyi/purchase/pojo/TicketRegistration.java
+++ b/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)
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
index 0650ce8..e5a64fd 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/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锛�
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java
index a6e152e..f696be7 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java
+++ b/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;
     }
 
diff --git a/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java b/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
index 0daeba8..fa50217 100644
--- a/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
+++ b/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);
     }
 }
diff --git a/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java b/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
index 1dcba08..f464e9b 100644
--- a/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
+++ b/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);
 }
diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
index 4bb8185..f29bedf 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
+++ b/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());
diff --git a/src/main/java/com/ruoyi/sales/controller/PaymentShippingController.java b/src/main/java/com/ruoyi/sales/controller/PaymentShippingController.java
new file mode 100644
index 0000000..c67d438
--- /dev/null
+++ b/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("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        }
+        return AjaxResult.success(paymentShippingService.removeByIds(ids));
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/sales/controller/ReceiptPaymentController.java b/src/main/java/com/ruoyi/sales/controller/ReceiptPaymentController.java
index 98b1105..0801107 100644
--- a/src/main/java/com/ruoyi/sales/controller/ReceiptPaymentController.java
+++ b/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")
diff --git a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
index a18d5c4..c384520 100644
--- a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
+++ b/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;
                 }
             }
diff --git a/src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java b/src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java
new file mode 100644
index 0000000..3a579d6
--- /dev/null
+++ b/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));
+    }
+}
diff --git a/src/main/java/com/ruoyi/sales/controller/SalespersonManagementController.java b/src/main/java/com/ruoyi/sales/controller/SalespersonManagementController.java
new file mode 100644
index 0000000..7d40587
--- /dev/null
+++ b/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("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        }
+        boolean delete = salespersonManagementService.removeByIds(ids);
+        return delete ? AjaxResult.success() : AjaxResult.error();
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java b/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
new file mode 100644
index 0000000..56b3e15
--- /dev/null
+++ b/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, "鍙戣揣淇℃伅");
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/sales/dto/ReceiptPaymentDto.java b/src/main/java/com/ruoyi/sales/dto/ReceiptPaymentDto.java
index cc9b935..5bbf31f 100644
--- a/src/main/java/com/ruoyi/sales/dto/ReceiptPaymentDto.java
+++ b/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;
 
diff --git a/src/main/java/com/ruoyi/sales/dto/ReceiptPaymentRecordDto.java b/src/main/java/com/ruoyi/sales/dto/ReceiptPaymentRecordDto.java
new file mode 100644
index 0000000..8e9bd4b
--- /dev/null
+++ b/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;
+
+}
diff --git a/src/main/java/com/ruoyi/sales/dto/SalesQuotationDto.java b/src/main/java/com/ruoyi/sales/dto/SalesQuotationDto.java
new file mode 100644
index 0000000..c292a10
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/sales/mapper/PaymentShippingMapper.java b/src/main/java/com/ruoyi/sales/mapper/PaymentShippingMapper.java
new file mode 100644
index 0000000..df9bde4
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/sales/mapper/ReceiptPaymentMapper.java b/src/main/java/com/ruoyi/sales/mapper/ReceiptPaymentMapper.java
index e7b34ed..222f9f5 100644
--- a/src/main/java/com/ruoyi/sales/mapper/ReceiptPaymentMapper.java
+++ b/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);
 
     /**
      * 寮�绁ㄥ彴璐﹁鎯�
diff --git a/src/main/java/com/ruoyi/sales/mapper/SalesQuotationMapper.java b/src/main/java/com/ruoyi/sales/mapper/SalesQuotationMapper.java
new file mode 100644
index 0000000..86f9c1a
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/sales/mapper/SalesQuotationProductMapper.java b/src/main/java/com/ruoyi/sales/mapper/SalesQuotationProductMapper.java
new file mode 100644
index 0000000..838e921
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/sales/mapper/SalespersonManagementMapper.java b/src/main/java/com/ruoyi/sales/mapper/SalespersonManagementMapper.java
new file mode 100644
index 0000000..d57e944
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/sales/mapper/ShippingInfoMapper.java b/src/main/java/com/ruoyi/sales/mapper/ShippingInfoMapper.java
new file mode 100644
index 0000000..88dec8a
--- /dev/null
+++ b/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();
+}
diff --git a/src/main/java/com/ruoyi/sales/pojo/PaymentShipping.java b/src/main/java/com/ruoyi/sales/pojo/PaymentShipping.java
new file mode 100644
index 0000000..17a691c
--- /dev/null
+++ b/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;
+
+}
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
index f1deeab..4ffdb03 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
+++ b/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;
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
index 1a82359..a135fa3 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
+++ b/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;
     /**
      * 绋庣巼
      */
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesQuotation.java b/src/main/java/com/ruoyi/sales/pojo/SalesQuotation.java
new file mode 100644
index 0000000..b22e6a3
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesQuotationProduct.java b/src/main/java/com/ruoyi/sales/pojo/SalesQuotationProduct.java
new file mode 100644
index 0000000..709dacf
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalespersonManagement.java b/src/main/java/com/ruoyi/sales/pojo/SalespersonManagement.java
new file mode 100644
index 0000000..a0a6636
--- /dev/null
+++ b/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;
+
+
+}
diff --git a/src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java b/src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java
new file mode 100644
index 0000000..3f80dc0
--- /dev/null
+++ b/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 = "閿�鍞彴璐d")
+    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;
+
+}
diff --git a/src/main/java/com/ruoyi/sales/service/PaymentShippingService.java b/src/main/java/com/ruoyi/sales/service/PaymentShippingService.java
new file mode 100644
index 0000000..31848ae
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/sales/service/SalesQuotationProductService.java b/src/main/java/com/ruoyi/sales/service/SalesQuotationProductService.java
new file mode 100644
index 0000000..6d37db3
--- /dev/null
+++ b/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> {
+}
diff --git a/src/main/java/com/ruoyi/sales/service/SalesQuotationService.java b/src/main/java/com/ruoyi/sales/service/SalesQuotationService.java
new file mode 100644
index 0000000..7f29a7f
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/sales/service/SalespersonManagementService.java b/src/main/java/com/ruoyi/sales/service/SalespersonManagementService.java
new file mode 100644
index 0000000..7fb9020
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/sales/service/ShippingInfoService.java b/src/main/java/com/ruoyi/sales/service/ShippingInfoService.java
new file mode 100644
index 0000000..81c7181
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/sales/service/impl/CommonFileServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/CommonFileServiceImpl.java
index 76831bc..06bd40e 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/CommonFileServiceImpl.java
+++ b/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锛�
diff --git a/src/main/java/com/ruoyi/sales/service/impl/PaymentShippingServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/PaymentShippingServiceImpl.java
new file mode 100644
index 0000000..067022a
--- /dev/null
+++ b/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;
+    }
+}
diff --git a/src/main/java/com/ruoyi/sales/service/impl/ReceiptPaymentServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/ReceiptPaymentServiceImpl.java
index 5349dab..ae93c3b 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/ReceiptPaymentServiceImpl.java
+++ b/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;
     }
 
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
index fa807c9..6493d46 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/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锛�
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationProductServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationProductServiceImpl.java
new file mode 100644
index 0000000..bb75795
--- /dev/null
+++ b/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 {
+}
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java
new file mode 100644
index 0000000..104a712
--- /dev/null
+++ b/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;
+    }
+
+
+}
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalespersonManagementServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalespersonManagementServiceImpl.java
new file mode 100644
index 0000000..0afd2bb
--- /dev/null
+++ b/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;
+    }
+}
diff --git a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
new file mode 100644
index 0000000..8469b9e
--- /dev/null
+++ b/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;
+    }
+}
diff --git a/src/main/java/com/ruoyi/staff/controller/HolidayApplicationController.java b/src/main/java/com/ruoyi/staff/controller/HolidayApplicationController.java
new file mode 100644
index 0000000..7ac13bd
--- /dev/null
+++ b/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));
+    }
+}
diff --git a/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java b/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java
new file mode 100644
index 0000000..2f84699
--- /dev/null
+++ b/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));
+    }
+}
diff --git a/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java b/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
index 4230695..7d73759 100644
--- a/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
+++ b/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("瀵煎叆澶辫触");
+    }
 
     /**
      * 鍦ㄨ亴鍛樺伐瀵煎嚭
diff --git a/src/main/java/com/ruoyi/staff/controller/StaffSchedulingController.java b/src/main/java/com/ruoyi/staff/controller/StaffSchedulingController.java
new file mode 100644
index 0000000..9f5d82c
--- /dev/null
+++ b/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(), "瀵煎嚭浜哄憳鎺掔彮鍒楄〃");
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/staff/dto/SaveStaffSchedulingDto.java b/src/main/java/com/ruoyi/staff/dto/SaveStaffSchedulingDto.java
new file mode 100644
index 0000000..25a41b3
--- /dev/null
+++ b/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;
+
+}
diff --git a/src/main/java/com/ruoyi/staff/dto/StaffSchedulingDto.java b/src/main/java/com/ruoyi/staff/dto/StaffSchedulingDto.java
new file mode 100644
index 0000000..ad8b812
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/staff/mapper/HolidayApplicationMapper.java b/src/main/java/com/ruoyi/staff/mapper/HolidayApplicationMapper.java
new file mode 100644
index 0000000..1b49c6f
--- /dev/null
+++ b/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> {
+}
diff --git a/src/main/java/com/ruoyi/staff/mapper/PersonalAttendanceRecordsMapper.java b/src/main/java/com/ruoyi/staff/mapper/PersonalAttendanceRecordsMapper.java
new file mode 100644
index 0000000..402bb45
--- /dev/null
+++ b/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> {
+}
diff --git a/src/main/java/com/ruoyi/staff/mapper/StaffSchedulingMapper.java b/src/main/java/com/ruoyi/staff/mapper/StaffSchedulingMapper.java
new file mode 100644
index 0000000..45fecac
--- /dev/null
+++ b/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 閽堝琛ㄣ�恠taff_scheduling銆戠殑鏁版嵁搴撴搷浣淢apper
+* @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);
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/staff/pojo/HolidayApplication.java b/src/main/java/com/ruoyi/staff/pojo/HolidayApplication.java
new file mode 100644
index 0000000..b76893e
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/staff/pojo/PersonalAttendanceRecords.java b/src/main/java/com/ruoyi/staff/pojo/PersonalAttendanceRecords.java
new file mode 100644
index 0000000..cbf11b7
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/staff/pojo/StaffJoinLeaveRecord.java b/src/main/java/com/ruoyi/staff/pojo/StaffJoinLeaveRecord.java
index d2ce38d..8de0b69 100644
--- a/src/main/java/com/ruoyi/staff/pojo/StaffJoinLeaveRecord.java
+++ b/src/main/java/com/ruoyi/staff/pojo/StaffJoinLeaveRecord.java
@@ -36,6 +36,14 @@
     private Integer staffState;
 
     /**
+     * 璇曠敤鏈燂紙鏈堬級
+     */
+    @Excel(name = "璇曠敤鏈燂紙鏈堬級")
+    private Integer probationPeriod;
+
+
+
+    /**
      * 鍛樺伐缂栧彿
      */
     @Excel(name = "鍛樺伐缂栧彿")
diff --git a/src/main/java/com/ruoyi/staff/pojo/StaffOnJob.java b/src/main/java/com/ruoyi/staff/pojo/StaffOnJob.java
index ca54c4c..dc17ed2 100644
--- a/src/main/java/com/ruoyi/staff/pojo/StaffOnJob.java
+++ b/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;
 
     /**
diff --git a/src/main/java/com/ruoyi/staff/pojo/StaffScheduling.java b/src/main/java/com/ruoyi/staff/pojo/StaffScheduling.java
new file mode 100644
index 0000000..89be920
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/staff/service/HolidayApplicationService.java b/src/main/java/com/ruoyi/staff/service/HolidayApplicationService.java
new file mode 100644
index 0000000..c02519b
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java b/src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java
index d32c69c..2cef9f2 100644
--- a/src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java
+++ b/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);
 }
diff --git a/src/main/java/com/ruoyi/staff/service/PersonalAttendanceRecordsService.java b/src/main/java/com/ruoyi/staff/service/PersonalAttendanceRecordsService.java
new file mode 100644
index 0000000..c39b007
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/staff/service/StaffSchedulingService.java b/src/main/java/com/ruoyi/staff/service/StaffSchedulingService.java
new file mode 100644
index 0000000..b12faa1
--- /dev/null
+++ b/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 閽堝琛ㄣ�恠taff_scheduling銆戠殑鏁版嵁搴撴搷浣淪ervice
+* @createDate 2025-09-03 14:50:34
+*/
+public interface StaffSchedulingService extends IService<StaffScheduling> {
+
+    void saveStaffScheduling(SaveStaffSchedulingDto saveStaffSchedulingDto);
+
+    IPage<StaffSchedulingDto> listPage(SearchSchedulingVo vo);
+}
diff --git a/src/main/java/com/ruoyi/staff/service/impl/HolidayApplicationServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/HolidayApplicationServiceImpl.java
new file mode 100644
index 0000000..8decb71
--- /dev/null
+++ b/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));
+    }
+}
diff --git a/src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceRecordsServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceRecordsServiceImpl.java
new file mode 100644
index 0000000..1fc363b
--- /dev/null
+++ b/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));
+    }
+}
diff --git a/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
index 8aaa840..9fc8c43 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
+++ b/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;
+        }
+    }
+
 
 }
diff --git a/src/main/java/com/ruoyi/staff/service/impl/StaffSchedulingServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/StaffSchedulingServiceImpl.java
new file mode 100644
index 0000000..b42d1fc
--- /dev/null
+++ b/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 閽堝琛ㄣ�恠taff_scheduling銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+ * @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);
+    }
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/staff/vo/SearchSchedulingVo.java b/src/main/java/com/ruoyi/staff/vo/SearchSchedulingVo.java
new file mode 100644
index 0000000..c546208
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/warehouse/controller/DocumentClassificationController.java b/src/main/java/com/ruoyi/warehouse/controller/DocumentClassificationController.java
new file mode 100644
index 0000000..625c82b
--- /dev/null
+++ b/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("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        return AjaxResult.success(documentClassificationService.deleteByIds(ids));
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/warehouse/controller/DocumentationBorrowManagementController.java b/src/main/java/com/ruoyi/warehouse/controller/DocumentationBorrowManagementController.java
new file mode 100644
index 0000000..fdf07fd
--- /dev/null
+++ b/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("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        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("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        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);
+    }
+}
diff --git a/src/main/java/com/ruoyi/warehouse/controller/DocumentationController.java b/src/main/java/com/ruoyi/warehouse/controller/DocumentationController.java
new file mode 100644
index 0000000..586c330
--- /dev/null
+++ b/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("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        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());
+    }
+}
diff --git a/src/main/java/com/ruoyi/warehouse/controller/DocumentationFileController.java b/src/main/java/com/ruoyi/warehouse/controller/DocumentationFileController.java
new file mode 100644
index 0000000..13a1bc7
--- /dev/null
+++ b/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));
+    }
+
+
+
+
+}
diff --git a/src/main/java/com/ruoyi/warehouse/controller/WarehouseController.java b/src/main/java/com/ruoyi/warehouse/controller/WarehouseController.java
new file mode 100644
index 0000000..0876334
--- /dev/null
+++ b/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("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        return AjaxResult.success(warehouseService.deleteByIds(ids));
+    }
+}
diff --git a/src/main/java/com/ruoyi/warehouse/controller/WarehouseGoodsShelvesController.java b/src/main/java/com/ruoyi/warehouse/controller/WarehouseGoodsShelvesController.java
new file mode 100644
index 0000000..bed5510
--- /dev/null
+++ b/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("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        return  AjaxResult.success(warehouseGoodsShelvesService.deleteByIds(ids));
+    }
+}
diff --git a/src/main/java/com/ruoyi/warehouse/controller/WarehouseGoodsShelvesRowcolController.java b/src/main/java/com/ruoyi/warehouse/controller/WarehouseGoodsShelvesRowcolController.java
new file mode 100644
index 0000000..36073ac
--- /dev/null
+++ b/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);
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/warehouse/dto/DocumentClassificationDto.java b/src/main/java/com/ruoyi/warehouse/dto/DocumentClassificationDto.java
new file mode 100644
index 0000000..ed20c8d
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/warehouse/dto/DocumentClassificationTreeDto.java b/src/main/java/com/ruoyi/warehouse/dto/DocumentClassificationTreeDto.java
new file mode 100644
index 0000000..e2817db
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/warehouse/dto/DocumentationBorrowManagementDto.java b/src/main/java/com/ruoyi/warehouse/dto/DocumentationBorrowManagementDto.java
new file mode 100644
index 0000000..8fb893a
--- /dev/null
+++ b/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;
+
+}
diff --git a/src/main/java/com/ruoyi/warehouse/dto/DocumentationDto.java b/src/main/java/com/ruoyi/warehouse/dto/DocumentationDto.java
new file mode 100644
index 0000000..ad10fc2
--- /dev/null
+++ b/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;
+
+}
diff --git a/src/main/java/com/ruoyi/warehouse/dto/DocumentationReturnManagementDto.java b/src/main/java/com/ruoyi/warehouse/dto/DocumentationReturnManagementDto.java
new file mode 100644
index 0000000..a65e1e0
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/warehouse/dto/ReturnExportDto.java b/src/main/java/com/ruoyi/warehouse/dto/ReturnExportDto.java
new file mode 100644
index 0000000..bb9c391
--- /dev/null
+++ b/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; // 褰掕繕鏃堕棿
+}
diff --git a/src/main/java/com/ruoyi/warehouse/dto/WarehouseDto.java b/src/main/java/com/ruoyi/warehouse/dto/WarehouseDto.java
new file mode 100644
index 0000000..34ac3f1
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/warehouse/dto/WarehouseGoodsShelvesDto.java b/src/main/java/com/ruoyi/warehouse/dto/WarehouseGoodsShelvesDto.java
new file mode 100644
index 0000000..b637542
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/warehouse/dto/WarehouseGoodsShelvesRowcolDto.java b/src/main/java/com/ruoyi/warehouse/dto/WarehouseGoodsShelvesRowcolDto.java
new file mode 100644
index 0000000..2bff39e
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/warehouse/dto/WarehouseTreeDto.java b/src/main/java/com/ruoyi/warehouse/dto/WarehouseTreeDto.java
new file mode 100644
index 0000000..80be317
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/warehouse/mapper/DocumentClassificationMapper.java b/src/main/java/com/ruoyi/warehouse/mapper/DocumentClassificationMapper.java
new file mode 100644
index 0000000..93b121f
--- /dev/null
+++ b/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 閽堝琛ㄣ�恉ocument_classification(鏂囨。鍒嗙被琛�)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @createDate 2025-08-15 10:44:23
+* @Entity com.ruoyi.warehouse.pojo.DocumentClassification
+*/
+@Mapper
+public interface DocumentClassificationMapper extends BaseMapper<DocumentClassification> {
+
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/warehouse/mapper/DocumentationBorrowManagementMapper.java b/src/main/java/com/ruoyi/warehouse/mapper/DocumentationBorrowManagementMapper.java
new file mode 100644
index 0000000..6af2ceb
--- /dev/null
+++ b/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 閽堝琛ㄣ�恉ocumentation_borrow_management(鏂囨。鍊熼槄-褰掕繕琛�)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @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);
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/warehouse/mapper/DocumentationFileMapper.java b/src/main/java/com/ruoyi/warehouse/mapper/DocumentationFileMapper.java
new file mode 100644
index 0000000..0617258
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/warehouse/mapper/DocumentationMapper.java b/src/main/java/com/ruoyi/warehouse/mapper/DocumentationMapper.java
new file mode 100644
index 0000000..33278bf
--- /dev/null
+++ b/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 閽堝琛ㄣ�恉ocumentation(鏂囨。淇℃伅琛�)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @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();
+
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/warehouse/mapper/DocumentationReturnManagementMapper.java b/src/main/java/com/ruoyi/warehouse/mapper/DocumentationReturnManagementMapper.java
new file mode 100644
index 0000000..d9de592
--- /dev/null
+++ b/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 閽堝琛ㄣ�恉ocumentation_borrow_management(鏂囨。鍊熼槄-褰掕繕琛�)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @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);
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/warehouse/mapper/WarehouseGoodsShelvesMapper.java b/src/main/java/com/ruoyi/warehouse/mapper/WarehouseGoodsShelvesMapper.java
new file mode 100644
index 0000000..d02e0cd
--- /dev/null
+++ b/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 閽堝琛ㄣ�恮arehouse_goods_shelves(浠撳簱璐ф灦琛�)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @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);
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/warehouse/mapper/WarehouseGoodsShelvesRowcolMapper.java b/src/main/java/com/ruoyi/warehouse/mapper/WarehouseGoodsShelvesRowcolMapper.java
new file mode 100644
index 0000000..69da1ee
--- /dev/null
+++ b/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 閽堝琛ㄣ�恮arehouse_goods_shelves_rowcol(浠撳簱璐ф灦灞傦紝鍒楄〃)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @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);
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/warehouse/mapper/WarehouseMapper.java b/src/main/java/com/ruoyi/warehouse/mapper/WarehouseMapper.java
new file mode 100644
index 0000000..392f8ca
--- /dev/null
+++ b/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 閽堝琛ㄣ�恮arehouse(浠撳簱琛�)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @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);
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/warehouse/pojo/DocumentClassification.java b/src/main/java/com/ruoyi/warehouse/pojo/DocumentClassification.java
new file mode 100644
index 0000000..98855ce
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/warehouse/pojo/Documentation.java b/src/main/java/com/ruoyi/warehouse/pojo/Documentation.java
new file mode 100644
index 0000000..0c1a612
--- /dev/null
+++ b/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;
+
+    /**
+     * 璐d换浜�
+     */
+    @Excel(name = "璐d换浜�")
+    @ApiModelProperty(value = "璐d换浜�")
+    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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/warehouse/pojo/DocumentationBorrowManagement.java b/src/main/java/com/ruoyi/warehouse/pojo/DocumentationBorrowManagement.java
new file mode 100644
index 0000000..a6c560f
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/warehouse/pojo/DocumentationFile.java b/src/main/java/com/ruoyi/warehouse/pojo/DocumentationFile.java
new file mode 100644
index 0000000..c24805c
--- /dev/null
+++ b/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;
+
+
+}
diff --git a/src/main/java/com/ruoyi/warehouse/pojo/DocumentationReturnManagement.java b/src/main/java/com/ruoyi/warehouse/pojo/DocumentationReturnManagement.java
new file mode 100644
index 0000000..5573923
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/warehouse/pojo/Warehouse.java b/src/main/java/com/ruoyi/warehouse/pojo/Warehouse.java
new file mode 100644
index 0000000..a8ae602
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/warehouse/pojo/WarehouseGoodsShelves.java b/src/main/java/com/ruoyi/warehouse/pojo/WarehouseGoodsShelves.java
new file mode 100644
index 0000000..d267986
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/warehouse/pojo/WarehouseGoodsShelvesRowcol.java b/src/main/java/com/ruoyi/warehouse/pojo/WarehouseGoodsShelvesRowcol.java
new file mode 100644
index 0000000..4372314
--- /dev/null
+++ b/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;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/warehouse/service/DocumentClassificationService.java b/src/main/java/com/ruoyi/warehouse/service/DocumentClassificationService.java
new file mode 100644
index 0000000..0fbe456
--- /dev/null
+++ b/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 閽堝琛ㄣ�恉ocument_classification(鏂囨。鍒嗙被琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice
+* @createDate 2025-08-15 10:44:23
+*/
+public interface DocumentClassificationService extends IService<DocumentClassification> {
+
+    boolean deleteByIds(List<Long> ids);
+
+    List<DocumentClassificationTreeDto> selectDocumentClassificationList();
+}
diff --git a/src/main/java/com/ruoyi/warehouse/service/DocumentationBorrowManagementService.java b/src/main/java/com/ruoyi/warehouse/service/DocumentationBorrowManagementService.java
new file mode 100644
index 0000000..3f76061
--- /dev/null
+++ b/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 閽堝琛ㄣ�恉ocumentation_borrow_management(鏂囨。鍊熼槄-褰掕繕琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice
+* @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);
+}
diff --git a/src/main/java/com/ruoyi/warehouse/service/DocumentationFileService.java b/src/main/java/com/ruoyi/warehouse/service/DocumentationFileService.java
new file mode 100644
index 0000000..575ecd4
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/warehouse/service/DocumentationService.java b/src/main/java/com/ruoyi/warehouse/service/DocumentationService.java
new file mode 100644
index 0000000..32910ce
--- /dev/null
+++ b/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 閽堝琛ㄣ�恉ocumentation(鏂囨。淇℃伅琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice
+* @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();
+}
diff --git a/src/main/java/com/ruoyi/warehouse/service/WarehouseGoodsShelvesRowcolService.java b/src/main/java/com/ruoyi/warehouse/service/WarehouseGoodsShelvesRowcolService.java
new file mode 100644
index 0000000..ed3bccc
--- /dev/null
+++ b/src/main/java/com/ruoyi/warehouse/service/WarehouseGoodsShelvesRowcolService.java
@@ -0,0 +1,23 @@
+package com.ruoyi.warehouse.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.warehouse.pojo.WarehouseGoodsShelvesRowcol;
+import com.ruoyi.warehouse.dto.WarehouseGoodsShelvesRowcolDto;
+
+import java.util.List;
+
+/**
+* @author 86151
+* @description 閽堝琛ㄣ�恮arehouse_goods_shelves_rowcol(浠撳簱璐ф灦灞傦紝鍒楄〃)銆戠殑鏁版嵁搴撴搷浣淪ervice
+* @createDate 2025-08-13 11:49:02
+*/
+public interface WarehouseGoodsShelvesRowcolService extends IService<WarehouseGoodsShelvesRowcol> {
+
+    boolean deleteByIds(List<Long> ids);
+
+
+    List<WarehouseGoodsShelvesRowcolDto> getList(WarehouseGoodsShelvesRowcol warehouseGoodsShelvesRowcol);
+
+
+
+}
diff --git a/src/main/java/com/ruoyi/warehouse/service/WarehouseGoodsShelvesService.java b/src/main/java/com/ruoyi/warehouse/service/WarehouseGoodsShelvesService.java
new file mode 100644
index 0000000..622d8e1
--- /dev/null
+++ b/src/main/java/com/ruoyi/warehouse/service/WarehouseGoodsShelvesService.java
@@ -0,0 +1,27 @@
+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.WarehouseGoodsShelvesDto;
+import com.ruoyi.warehouse.pojo.WarehouseGoodsShelves;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+* @author 86151
+* @description 閽堝琛ㄣ�恮arehouse_goods_shelves(浠撳簱璐ф灦琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice
+* @createDate 2025-08-13 11:49:02
+*/
+public interface WarehouseGoodsShelvesService extends IService<WarehouseGoodsShelves> {
+
+
+    boolean add(WarehouseGoodsShelves warehouseGoodsShelves);
+
+    boolean updateRowcolById(WarehouseGoodsShelves warehouseGoodsShelves);
+
+    boolean deleteByIds(List<Long> ids);
+
+    List<WarehouseGoodsShelvesDto> findList(WarehouseGoodsShelves warehouseGoodsShelves);
+}
diff --git a/src/main/java/com/ruoyi/warehouse/service/WarehouseService.java b/src/main/java/com/ruoyi/warehouse/service/WarehouseService.java
new file mode 100644
index 0000000..0b68de8
--- /dev/null
+++ b/src/main/java/com/ruoyi/warehouse/service/WarehouseService.java
@@ -0,0 +1,24 @@
+package com.ruoyi.warehouse.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.warehouse.dto.WarehouseDto;
+import com.ruoyi.warehouse.dto.WarehouseGoodsShelvesDto;
+import com.ruoyi.warehouse.dto.WarehouseTreeDto;
+import com.ruoyi.warehouse.pojo.Warehouse;
+
+import java.util.List;
+
+/**
+* @author 86151
+* @description 閽堝琛ㄣ�恮arehouse(浠撳簱琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice
+* @createDate 2025-08-13 11:49:02
+*/
+public interface WarehouseService extends IService<Warehouse> {
+
+    boolean deleteByIds(List<Long> ids);
+
+    List<Warehouse> findList(Warehouse warehouse);
+
+    List<WarehouseTreeDto> findListTree();
+}
diff --git a/src/main/java/com/ruoyi/warehouse/service/impl/DocumentClassificationServiceImpl.java b/src/main/java/com/ruoyi/warehouse/service/impl/DocumentClassificationServiceImpl.java
new file mode 100644
index 0000000..54c642e
--- /dev/null
+++ b/src/main/java/com/ruoyi/warehouse/service/impl/DocumentClassificationServiceImpl.java
@@ -0,0 +1,97 @@
+package com.ruoyi.warehouse.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+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.warehouse.dto.DocumentClassificationDto;
+import com.ruoyi.warehouse.dto.DocumentClassificationTreeDto;
+import com.ruoyi.warehouse.dto.DocumentationDto;
+import com.ruoyi.warehouse.mapper.DocumentationMapper;
+import com.ruoyi.warehouse.pojo.DocumentClassification;
+import com.ruoyi.warehouse.pojo.Documentation;
+import com.ruoyi.warehouse.service.DocumentClassificationService;
+import com.ruoyi.warehouse.mapper.DocumentClassificationMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+* @author 86151
+* @description 閽堝琛ㄣ�恉ocument_classification(鏂囨。鍒嗙被琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+* @createDate 2025-08-15 10:44:23
+*/
+@Service
+public class DocumentClassificationServiceImpl extends ServiceImpl<DocumentClassificationMapper, DocumentClassification>
+    implements DocumentClassificationService{
+    @Autowired
+    private DocumentationMapper documentationMapper;
+    @Autowired
+    private DocumentClassificationMapper documentClassificationMapper;
+    @Override
+    public boolean deleteByIds(List<Long> ids) {
+        List<DocumentClassification> list = documentClassificationMapper.selectList(new LambdaQueryWrapper<DocumentClassification>().in(DocumentClassification::getId, ids));
+        for (DocumentClassification documentClassification : list) {
+          //濡傛灉姣忛」鐨勭埗id涓虹┖锛岃鏄庢槸鏍硅妭鐐癸紝闇�瑕佸垹闄ゆ枃妗d俊鎭〃涓殑鏁版嵁
+            List<DocumentationDto> documentationDtos = documentationMapper.listByDocumentClassificationId(documentClassification.getId());
+            if (CollectionUtils.isNotEmpty(documentationDtos)){
+                throw new RuntimeException("瀛樺湪鏂囨。淇℃伅锛屼笉鑳藉垹闄�");
+            }
+            documentClassificationMapper.deleteById(documentClassification.getId());
+        }
+        return true;
+    }
+
+    @Override
+    public List<DocumentClassificationTreeDto> selectDocumentClassificationList() {
+        // 鏌ヨ鏍硅妭鐐癸紙parentId 涓� null锛�
+        LambdaQueryWrapper<DocumentClassification> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.isNull(DocumentClassification::getParentId);
+
+        // 鏌ヨ鏍硅妭鐐瑰垪琛�
+        List<DocumentClassification> rootList = baseMapper.selectList(queryWrapper);
+
+        // 杞崲涓烘爲鑺傜偣骞堕�掑綊鏋勫缓瀛愭爲
+        List<DocumentClassificationTreeDto> tree = new ArrayList<>();
+        for (DocumentClassification documentClassification : rootList) {
+            DocumentClassificationTreeDto node = convertToTreeDto(documentClassification);
+            node.setChildren(buildDocumentChildrenNodes(documentClassification.getId()));
+            tree.add(node);
+        }
+        return tree;
+    }
+    // 閫掑綊鏋勫缓瀛愯妭鐐�
+    private List<DocumentClassificationTreeDto> buildDocumentChildrenNodes(Long parentId) {
+        // 鏌ヨ褰撳墠鐖惰妭鐐圭殑瀛愯妭鐐�
+        LambdaQueryWrapper<DocumentClassification> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(DocumentClassification::getParentId, parentId);
+        List<DocumentClassification> childList = baseMapper.selectList(queryWrapper);
+
+        // 杞崲瀛愯妭鐐瑰苟閫掑綊鏋勫缓瀹冧滑鐨勫瓙鏍�
+        List<DocumentClassificationTreeDto> children = new ArrayList<>();
+        for (DocumentClassification child : childList) {
+            DocumentClassificationTreeDto childNode = convertToTreeDto(child);
+            childNode.setChildren(buildDocumentChildrenNodes(child.getId()));
+            children.add(childNode);
+        }
+
+        return children;
+    }
+    // 灏� DocumentClassification 杞崲涓� DocumentClassificationTreeDto
+    private DocumentClassificationTreeDto convertToTreeDto(DocumentClassification documentClassification) {
+        DocumentClassificationTreeDto dto = new DocumentClassificationTreeDto();
+        BeanUtils.copyProperties(documentClassification, dto);
+        dto.setCategory(documentClassification.getCategory()); // 璁剧疆 label 涓轰骇鍝佸悕绉�
+        dto.setChildren(new ArrayList<>());
+        return dto;
+    }
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/warehouse/service/impl/DocumentationBorrowManagementServiceImpl.java b/src/main/java/com/ruoyi/warehouse/service/impl/DocumentationBorrowManagementServiceImpl.java
new file mode 100644
index 0000000..4ddf5a2
--- /dev/null
+++ b/src/main/java/com/ruoyi/warehouse/service/impl/DocumentationBorrowManagementServiceImpl.java
@@ -0,0 +1,168 @@
+package com.ruoyi.warehouse.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+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.common.utils.poi.ExcelUtil;
+import com.ruoyi.warehouse.dto.DocumentationBorrowManagementDto;
+import com.ruoyi.warehouse.dto.ReturnExportDto;
+import com.ruoyi.warehouse.mapper.DocumentationReturnManagementMapper;
+import com.ruoyi.warehouse.pojo.Documentation;
+import com.ruoyi.warehouse.pojo.DocumentationBorrowManagement;
+import com.ruoyi.warehouse.pojo.DocumentationReturnManagement;
+import com.ruoyi.warehouse.service.DocumentationBorrowManagementService;
+import com.ruoyi.warehouse.mapper.DocumentationBorrowManagementMapper;
+import com.ruoyi.warehouse.service.DocumentationService;
+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.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+* @author 86151
+* @description 閽堝琛ㄣ�恉ocumentation_borrow_management(鏂囨。鍊熼槄-褰掕繕琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+* @createDate 2025-08-14 15:55:45
+*/
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class DocumentationBorrowManagementServiceImpl extends ServiceImpl<DocumentationBorrowManagementMapper, DocumentationBorrowManagement>
+    implements DocumentationBorrowManagementService{
+    @Autowired
+    private DocumentationBorrowManagementMapper documentationBorrowManagementMapper;
+    @Autowired
+    private DocumentationReturnManagementMapper documentationReturnManagementMapper;
+    @Autowired
+    private DocumentationService documentationService;
+    @Override
+    public IPage<DocumentationBorrowManagement> listPage(Page page, DocumentationBorrowManagement documentationBorrowManagement) {
+        IPage<DocumentationBorrowManagement> listPage = documentationBorrowManagementMapper.listPage(page, documentationBorrowManagement);
+        return listPage;
+    }
+
+
+    @Override
+    public boolean add(DocumentationBorrowManagement documentationBorrowManagement) {
+        documentationBorrowManagement.setBorrowStatus("鍊熼槄");
+        documentationBorrowManagementMapper.insert(documentationBorrowManagement);
+        Documentation documentation = documentationService.getById(documentationBorrowManagement.getDocumentationId());
+        documentation.setDocStatus("鍊熷嚭");
+        documentationService.updateById(documentation);
+        return true;
+    }
+    @Override
+    public boolean reventdbm(DocumentationReturnManagement documentationReturnManagement) {
+        // 鏇存柊鍊熼槄璁板綍鐘舵�佷负褰掕繕
+        DocumentationBorrowManagement documentationBorrowManagement1 = documentationBorrowManagementMapper.selectById(documentationReturnManagement.getBorrowId());
+
+        DocumentationReturnManagement returnManagement = new DocumentationReturnManagement();
+        returnManagement.setDocumentationId(documentationBorrowManagement1.getDocumentationId());
+        returnManagement.setBorrower(documentationBorrowManagement1.getBorrower());
+        returnManagement.setBorrowPurpose(documentationBorrowManagement1.getBorrowPurpose());
+        returnManagement.setBorrowDate(documentationBorrowManagement1.getBorrowDate());
+        returnManagement.setDueReturnDate(documentationBorrowManagement1.getDueReturnDate());
+        returnManagement.setBorrowStatus("褰掕繕");
+        returnManagement.setBorrowId(documentationReturnManagement.getBorrowId());
+        returnManagement.setReturner(documentationReturnManagement.getReturner());
+        returnManagement.setReturnDate(LocalDate.now());
+        returnManagement.setRemark(documentationReturnManagement.getRemark());
+
+        documentationReturnManagementMapper.insert(returnManagement);
+        documentationBorrowManagement1.setBorrowStatus("褰掕繕");
+        documentationBorrowManagement1.setReturner(documentationReturnManagement.getReturner());
+        documentationBorrowManagement1.setReturnDate(LocalDate.now());
+        documentationBorrowManagementMapper.updateById(documentationBorrowManagement1);
+        // 鏇存柊鏂囨。鐘舵�佷负姝e父
+        Documentation documentation = documentationService.getById(documentationBorrowManagement1.getDocumentationId());
+        documentation.setDocStatus("姝e父");
+        documentationService.updateById(documentation);
+        return true;
+    }
+
+    @Override
+    public boolean reventDeleteByIds(List<Long> ids) {
+        QueryWrapper<DocumentationReturnManagement> queryWrapper = new QueryWrapper<>();
+        queryWrapper.in("id", ids);
+//        queryWrapper.eq("borrow_status", "褰掕繕");
+        List<DocumentationReturnManagement> list = documentationReturnManagementMapper.selectList(queryWrapper);
+
+        for (DocumentationReturnManagement documentationReturnManagement : list) {
+
+            try {
+                documentationReturnManagementMapper.deleteById(documentationReturnManagement);
+                DocumentationBorrowManagement documentationBorrowManagement = documentationBorrowManagementMapper.selectById(documentationReturnManagement.getBorrowId());
+                documentationBorrowManagement.setBorrowStatus("鍊熼槄");
+                documentationBorrowManagement.setReturner(null);
+                documentationBorrowManagement.setReturnDate(null);
+                documentationBorrowManagementMapper.updateById(documentationBorrowManagement);
+
+                Documentation documentation = documentationService.getById(documentationReturnManagement.getDocumentationId());
+                documentation.setDocStatus("鍊熷嚭");
+                documentationService.updateById(documentation);
+            } catch (Exception e) {
+                throw new RuntimeException("鍒犻櫎褰掕繕璁板綍鍜屾枃妗g姸鎬佹椂鍑洪敊", e);
+            }
+        }
+//        documentationReturnManagementMapper.deleteBatchIds(ids);
+        return true;
+    }
+
+    @Override
+    public void export(HttpServletResponse response, DocumentationBorrowManagement documentationBorrowManagement) {
+        List<DocumentationBorrowManagementDto> documentationBorrowManagements = documentationBorrowManagementMapper.export(documentationBorrowManagement);
+        ExcelUtil<DocumentationBorrowManagementDto> util = new ExcelUtil<>(DocumentationBorrowManagementDto.class);
+        util.exportExcel(response, documentationBorrowManagements, "鏂囨。鍊熼槄-鍊熼槄璁板綍");
+    }
+
+    @Override
+    public void exportrevent(HttpServletResponse response, DocumentationReturnManagement documentationReturnManagement) {
+        List<ReturnExportDto> documentationReturnManagements = documentationReturnManagementMapper.exportrevent(documentationReturnManagement);
+        ExcelUtil<ReturnExportDto> util = new ExcelUtil<>(ReturnExportDto.class);
+        util.exportExcel(response, documentationReturnManagements, "鏂囨。鍊熼槄-褰掕繕璁板綍");
+    }
+
+    @Override
+    public List<DocumentationBorrowManagementDto> listAll() {
+        return documentationBorrowManagementMapper.list(new LambdaQueryWrapper<DocumentationBorrowManagementDto>().eq(DocumentationBorrowManagementDto::getBorrowStatus, "鍊熼槄"));
+    }
+
+    @Override
+    public List<DocumentationBorrowManagementDto> selectByDocumentationId(Long id) {
+        List<DocumentationBorrowManagementDto> list = documentationBorrowManagementMapper.list(new LambdaQueryWrapper<DocumentationBorrowManagementDto>()
+                .eq(DocumentationBorrowManagementDto::getDocumentationId, id)
+                .eq(DocumentationBorrowManagementDto::getBorrowStatus, "鍊熼槄"));
+        if (list.isEmpty()){
+            throw new RuntimeException("鏂囨。鏈鍊熼槄");
+        }
+        return list;
+    }
+
+    @Override
+    public boolean deleteByIds(List<Long> ids) {
+        List<DocumentationBorrowManagement> list = documentationBorrowManagementMapper.selectList(new LambdaQueryWrapper<DocumentationBorrowManagement>().in(DocumentationBorrowManagement::getId, ids));
+        for (DocumentationBorrowManagement documentationBorrowManagement : list) {
+            Documentation documentation = documentationService.getById(documentationBorrowManagement.getDocumentationId());
+            documentation.setDocStatus("姝e父");
+            boolean b = documentationService.updateById(documentation);
+            if (!b){
+                throw new RuntimeException("鏇存柊鏂囨。鐘舵�佸け璐�");
+            }
+        }
+        documentationBorrowManagementMapper.deleteBatchIds(ids);
+        return true;
+    }
+
+
+
+
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/warehouse/service/impl/DocumentationFileServiceImpl.java b/src/main/java/com/ruoyi/warehouse/service/impl/DocumentationFileServiceImpl.java
new file mode 100644
index 0000000..61dafcd
--- /dev/null
+++ b/src/main/java/com/ruoyi/warehouse/service/impl/DocumentationFileServiceImpl.java
@@ -0,0 +1,26 @@
+package com.ruoyi.warehouse.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.warehouse.mapper.DocumentationFileMapper;
+import com.ruoyi.warehouse.pojo.DocumentationFile;
+import com.ruoyi.warehouse.service.DocumentationFileService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@AllArgsConstructor
+@Service
+public class DocumentationFileServiceImpl extends ServiceImpl<DocumentationFileMapper, DocumentationFile> implements DocumentationFileService {
+
+    private DocumentationFileMapper documentationFileMapper;
+
+
+    @Override
+    public List<DocumentationFile> documentationFileListPage(DocumentationFile documentationFile) {
+        return documentationFileMapper.documentationFileListPage(documentationFile);
+    }
+}
diff --git a/src/main/java/com/ruoyi/warehouse/service/impl/DocumentationServiceImpl.java b/src/main/java/com/ruoyi/warehouse/service/impl/DocumentationServiceImpl.java
new file mode 100644
index 0000000..5a7cf30
--- /dev/null
+++ b/src/main/java/com/ruoyi/warehouse/service/impl/DocumentationServiceImpl.java
@@ -0,0 +1,116 @@
+package com.ruoyi.warehouse.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.warehouse.dto.DocumentationDto;
+import com.ruoyi.warehouse.pojo.Documentation;
+import com.ruoyi.warehouse.pojo.DocumentationBorrowManagement;
+import com.ruoyi.warehouse.service.DocumentationService;
+import com.ruoyi.warehouse.mapper.DocumentationMapper;
+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;
+import java.util.stream.Collectors;
+
+/**
+* @author 86151
+* @description 閽堝琛ㄣ�恉ocumentation(鏂囨。淇℃伅琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+* @createDate 2025-08-14 14:05:49
+*/
+@Service
+public class DocumentationServiceImpl extends ServiceImpl<DocumentationMapper, Documentation>
+    implements DocumentationService{
+    @Autowired
+    private DocumentationMapper documentationMapper;
+    @Override
+    public IPage<DocumentationDto> listPage(Page page, Documentation documentation) {
+        return documentationMapper.listPage(page, documentation);
+    }
+
+    @Override
+    public void export(HttpServletResponse response,Documentation documentation) {
+        IPage<DocumentationDto> list = documentationMapper.listPage(null, documentation);
+        ExcelUtil<DocumentationDto> util = new ExcelUtil<>(DocumentationDto.class);
+        util.exportExcel(response, list.getRecords(), "鏂囨。淇℃伅琛�");
+    }
+
+    @Override
+    public boolean deleteByIds(List<Long> ids) {
+        List<Documentation> documentationList = documentationMapper.selectList(new LambdaQueryWrapper<Documentation>().in(Documentation::getId, ids));
+        for (Documentation documentation : documentationList) {
+            //濡傛灉鏂囨。鐘舵�佹槸宸插�熷嚭锛屼笉鑳藉垹闄�
+            if ("鍊熷嚭".equals(documentation.getDocStatus()) || "浣滃簾".equals(documentation.getDocStatus())) {
+                throw new RuntimeException("褰撳墠鏂囨。鐘舵�佷负 " + documentation.getDocStatus() + "锛屼笉鏀寔鍒犻櫎");
+            }
+            documentationMapper.deleteById(documentation.getId());
+        }
+        return true;
+    }
+    /**
+     * 鍒楄〃鎵�鏈夋枃妗�
+     * @return
+     */
+    @Override
+    public List<DocumentationDto> listAll() {
+        List<DocumentationDto> list = documentationMapper.list().stream().filter(documentationDto -> "姝e父".equals(documentationDto.getDocStatus())).collect(Collectors.toList());
+        return list;
+    }
+    /**
+     * 鑾峰彇鏂囨。鎬绘暟
+     * @return
+     */
+    @Override
+    public Integer getTotalDocsCount() {
+        return documentationMapper.countTotalDocs();
+    }
+    /**
+     * 鑾峰彇鏂囨。鍒嗙被鎬绘暟
+     * @return
+     */
+    @Override
+    public Integer getCategoryNumCount() {
+        return documentationMapper.countCategoryNum();
+    }
+    /**
+     * 鑾峰彇宸插�熷嚭鏂囨。鎬绘暟
+     * @return
+     */
+    @Override
+    public Integer getBorrowedDocsCount() {
+        return documentationMapper.countBorrowedDocs();
+    }
+    /**
+     * 鑾峰彇姣忔湀鏂板鏂囨。鎬绘暟
+     * @return
+     */
+    @Override
+    public Integer getMonthlyAddedDocsCount() {
+        return documentationMapper.countMonthlyAddedDocs();
+    }
+    /**
+     * 鑾峰彇鏂囨。鍒嗙被鍒嗗竷
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> getCategoryDistribution() {
+        return documentationMapper.countCategoryDistribution();
+    }
+    /**
+     * 鑾峰彇鏂囨。鐘舵�佸垎甯�
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> getStatusDistribution() {
+        return documentationMapper.countStatusDistribution();
+    }
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/warehouse/service/impl/WarehouseGoodsShelvesRowcolServiceImpl.java b/src/main/java/com/ruoyi/warehouse/service/impl/WarehouseGoodsShelvesRowcolServiceImpl.java
new file mode 100644
index 0000000..7715520
--- /dev/null
+++ b/src/main/java/com/ruoyi/warehouse/service/impl/WarehouseGoodsShelvesRowcolServiceImpl.java
@@ -0,0 +1,63 @@
+package com.ruoyi.warehouse.service.impl;
+
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.warehouse.mapper.DocumentationMapper;
+import com.ruoyi.warehouse.mapper.WarehouseGoodsShelvesRowcolMapper;
+import com.ruoyi.warehouse.pojo.Documentation;
+import com.ruoyi.warehouse.pojo.WarehouseGoodsShelvesRowcol;
+import com.ruoyi.warehouse.dto.WarehouseGoodsShelvesRowcolDto;
+import com.ruoyi.warehouse.service.WarehouseGoodsShelvesRowcolService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.List;
+
+
+/**
+* @author 86151
+* @description 閽堝琛ㄣ�恮arehouse_goods_shelves_rowcol(浠撳簱璐ф灦灞傦紝鍒楄〃)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+* @createDate 2025-08-13 11:49:02
+*/
+@Service
+@Slf4j
+public class WarehouseGoodsShelvesRowcolServiceImpl extends ServiceImpl<WarehouseGoodsShelvesRowcolMapper, WarehouseGoodsShelvesRowcol>
+    implements WarehouseGoodsShelvesRowcolService {
+    @Autowired
+    private WarehouseGoodsShelvesRowcolMapper warehouseGoodsShelvesRowcolMapper;
+    @Autowired
+    private DocumentationMapper documentationMapper;
+
+    @Override
+    public List<WarehouseGoodsShelvesRowcolDto> getList(WarehouseGoodsShelvesRowcol warehouseGoodsShelvesRowcol) {
+        List<WarehouseGoodsShelvesRowcolDto> list = warehouseGoodsShelvesRowcolMapper.findList(warehouseGoodsShelvesRowcol);
+        for (WarehouseGoodsShelvesRowcolDto dto : list) {
+            //鑾峰彇灞俰ds
+            Long id = dto.getId();
+            //鑾峰彇鏂囨。
+            dto.setDocumentationDtoList(documentationMapper.listBywarehouseGoodsShelvesRowcolId(id));
+        }
+        return list;
+    }
+    @Override
+    public boolean deleteByIds(List<Long> ids) {
+        // 3. 妫�鏌ユ槸鍚︽湁鍟嗗搧
+        Wrapper<Documentation> queryWrapper = new LambdaQueryWrapper<Documentation>()
+                .in(Documentation::getWarehouseGoodsShelvesRowcolId, ids);
+        List<Documentation> documentations = documentationMapper.selectList(queryWrapper);
+        if (!documentations.isEmpty()) throw new RuntimeException("璐ф灦涓嬫湁鍟嗗搧锛屼笉鑳藉垹闄�");
+        warehouseGoodsShelvesRowcolMapper.deleteBatchIds(ids);
+        return true;
+    }
+
+
+
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/warehouse/service/impl/WarehouseGoodsShelvesServiceImpl.java b/src/main/java/com/ruoyi/warehouse/service/impl/WarehouseGoodsShelvesServiceImpl.java
new file mode 100644
index 0000000..3d33d5c
--- /dev/null
+++ b/src/main/java/com/ruoyi/warehouse/service/impl/WarehouseGoodsShelvesServiceImpl.java
@@ -0,0 +1,179 @@
+package com.ruoyi.warehouse.service.impl;
+
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+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.warehouse.dto.WarehouseGoodsShelvesDto;
+import com.ruoyi.warehouse.mapper.DocumentationMapper;
+import com.ruoyi.warehouse.mapper.WarehouseGoodsShelvesMapper;
+import com.ruoyi.warehouse.mapper.WarehouseGoodsShelvesRowcolMapper;
+import com.ruoyi.warehouse.pojo.Documentation;
+import com.ruoyi.warehouse.pojo.WarehouseGoodsShelvesRowcol;
+import com.ruoyi.warehouse.service.DocumentationService;
+import com.ruoyi.warehouse.service.WarehouseGoodsShelvesRowcolService;
+import com.ruoyi.warehouse.service.WarehouseGoodsShelvesService;
+import lombok.extern.slf4j.Slf4j;
+import com.ruoyi.warehouse.pojo.WarehouseGoodsShelves;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+* @author 86151
+* @description 閽堝琛ㄣ�恮arehouse_goods_shelves(浠撳簱璐ф灦琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+* @createDate 2025-08-13 11:49:02
+*/
+@Service
+@Slf4j
+@Transactional(rollbackFor = Exception.class)
+public class WarehouseGoodsShelvesServiceImpl extends ServiceImpl<WarehouseGoodsShelvesMapper, WarehouseGoodsShelves>
+    implements WarehouseGoodsShelvesService {
+    @Autowired
+    private WarehouseGoodsShelvesRowcolService warehouseGoodsShelvesRowcolService;
+    @Autowired
+    private WarehouseGoodsShelvesRowcolMapper warehouseGoodsShelvesRowcolMapper;
+    @Autowired
+    private WarehouseGoodsShelvesMapper warehouseGoodsShelvesMapper;
+    @Autowired
+    private DocumentationService documentationService;
+    @Autowired
+    private DocumentationMapper documentationMapper;
+
+    @Override
+    public boolean add(WarehouseGoodsShelves warehouseGoodsShelves) {
+        WarehouseGoodsShelves one = warehouseGoodsShelvesMapper.selectOne(new LambdaQueryWrapper<WarehouseGoodsShelves>().eq(WarehouseGoodsShelves::getId, warehouseGoodsShelves.getId()));
+        // 1. 妫�鏌ヨ揣鏋跺悕绉版槸鍚﹀凡瀛樺湪
+        if (one == null) {
+            if(warehouseGoodsShelves.getRow() == null || warehouseGoodsShelves.getRow() == 0 && warehouseGoodsShelves.getCol() == null || warehouseGoodsShelves.getCol() == 0){
+                throw new IllegalArgumentException("灞傛暟鍜屽垪鏁颁笉鑳戒负绌�");
+            }
+            int insert = warehouseGoodsShelvesMapper.insert(warehouseGoodsShelves);
+            if (insert <= 0) return false;
+        }
+
+        Long shelvesId = warehouseGoodsShelves.getId();
+        Long warehouseId = warehouseGoodsShelves.getWarehouseId();
+        // 3. 鎵归噺鍒涘缓琛屽垪璁板綍
+        List<WarehouseGoodsShelvesRowcol> rowcolList = new ArrayList<>();
+        for (long i = 1; i <= warehouseGoodsShelves.getRow(); i++) {
+            for (long j = 1; j <= warehouseGoodsShelves.getCol(); j++) {
+                WarehouseGoodsShelvesRowcol rowcol = new WarehouseGoodsShelvesRowcol();
+                rowcol.setRow(i);
+                rowcol.setCol(j);
+                rowcol.setWarehouseGoodsShelvesId(shelvesId);
+                rowcolList.add(rowcol);
+            }
+        }
+        // 4. 鎵归噺鎻掑叆琛屽垪璁板綍
+        if (!rowcolList.isEmpty()) {
+            try {
+                // 浣跨敤鎵归噺鎻掑叆鏂规硶鏇夸唬寰幆鍗曟潯鎻掑叆
+                warehouseGoodsShelvesRowcolService.saveBatch(rowcolList);
+            } catch (Exception e) {
+                // 鎶涘嚭寮傚父瑙﹀彂浜嬪姟鍥炴粴
+                throw e;
+            }
+        }
+        return true;
+    }
+    /**
+     * 鏍规嵁ID鏇存柊璐ф灦鍙婂叾琛屽垪淇℃伅
+     * @param warehouseGoodsShelves 璐ф灦淇℃伅
+     * @return 鏄惁鏇存柊鎴愬姛
+     */
+    @Override
+    public boolean updateRowcolById(WarehouseGoodsShelves warehouseGoodsShelves) {
+        Long shelvesId = warehouseGoodsShelves.getId();
+
+        // 鏋勫缓鏌ヨ鏉′欢锛氭煡璇㈣璐ф灦涓嬬殑鎵�鏈夎鍒楄褰�
+        Wrapper<WarehouseGoodsShelvesRowcol> queryWrapper = new LambdaQueryWrapper<WarehouseGoodsShelvesRowcol>()
+                .eq(WarehouseGoodsShelvesRowcol::getWarehouseGoodsShelvesId, shelvesId);
+        List<WarehouseGoodsShelvesRowcol> rowcolList = warehouseGoodsShelvesRowcolService.list(queryWrapper);
+        //鑾峰緱rowcolList涓墍鏈夌殑Id
+        List<Long> rowcolIds = rowcolList.stream()
+                .map(WarehouseGoodsShelvesRowcol::getId)
+                .collect(Collectors.toList());
+        // 3. 妫�鏌ユ槸鍚︽湁鍟嗗搧
+        Wrapper<Documentation> queryWrapper1 = new LambdaQueryWrapper<Documentation>()
+                .in(Documentation::getWarehouseGoodsShelvesRowcolId, rowcolIds);
+        List<Documentation> documentations = documentationMapper.selectList(queryWrapper1);
+        if (!documentations.isEmpty()) throw new RuntimeException("璐ф灦涓嬫湁鍟嗗搧锛屼笉鑳藉垹闄�");
+
+        // 鍏堟洿鏂拌揣鏋朵富淇℃伅
+        updateById(warehouseGoodsShelves);
+        // 鍒犻櫎鏃х殑琛屽垪璁板綍
+        warehouseGoodsShelvesRowcolService.removeByIds(rowcolIds);
+        // 娣诲姞鏂扮殑琛屽垪璁板綍
+        add(warehouseGoodsShelves);
+        return true;
+    }
+    /**
+     * 鎵归噺鍒犻櫎璐ф灦鍙婂叾鍏宠仈鐨勮鍒楄褰�
+     * @param ids 璐ф灦ID鍒楄〃
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    @Override
+    public boolean deleteByIds(List<Long> ids) {
+        // 1. 鍏堟煡璇㈡墍鏈夎鍒犻櫎鐨勮揣鏋朵俊鎭�
+        List<WarehouseGoodsShelves> shelvesList = warehouseGoodsShelvesMapper.selectBatchIds(ids);
+
+        // 2. 妫�鏌ユ墍鏈夎揣鏋舵槸鍚﹀瓨鍦ㄥ晢鍝侊紙鏈夊晢鍝佸垯涓嶅厑璁稿垹闄わ級
+        for (WarehouseGoodsShelves shelves : shelvesList) {
+            Long shelvesId = shelves.getId();
+            // 鏋勫缓鏌ヨ鏉′欢锛氭煡璇㈠綋鍓嶈揣鏋剁殑鎵�鏈夎鍒楄褰�
+            Wrapper<WarehouseGoodsShelvesRowcol> queryWrapper = new LambdaQueryWrapper<WarehouseGoodsShelvesRowcol>()
+                    .eq(WarehouseGoodsShelvesRowcol::getWarehouseGoodsShelvesId, shelvesId);
+
+            List<WarehouseGoodsShelvesRowcol> rowcolList = warehouseGoodsShelvesRowcolService.list(queryWrapper);
+            if (CollectionUtils.isEmpty(rowcolList)) {
+                continue; // 鏃犲叧鑱旇褰曪紝璺宠繃妫�鏌�
+            }
+            //鑾峰緱rowcolList涓墍鏈夌殑Id
+            List<Long> rowcolIds = rowcolList.stream()
+                    .map(WarehouseGoodsShelvesRowcol::getId)
+                    .collect(Collectors.toList());
+            // 3. 妫�鏌ユ槸鍚︽湁鍟嗗搧
+            Wrapper<Documentation> queryWrapper1 = new LambdaQueryWrapper<Documentation>()
+                    .in(Documentation::getWarehouseGoodsShelvesRowcolId, rowcolIds);
+            List<Documentation> documentations = documentationMapper.selectList(queryWrapper1);
+            if (!documentations.isEmpty()) throw new RuntimeException("璐ф灦涓嬫湁鍟嗗搧锛屼笉鑳藉垹闄�"); // 浠讳竴璐ф灦鏈夊晢鍝佸垯缁堟鍒犻櫎
+        }
+
+        // 3. 鍏堝垹闄よ揣鏋朵富璁板綍
+        warehouseGoodsShelvesMapper.deleteBatchIds(ids);
+
+        // 4. 鎵归噺鍒犻櫎鎵�鏈夎鍒楄褰�
+        List<Long> allShelvesIds = shelvesList.stream()
+                .map(WarehouseGoodsShelves::getId)
+                .collect(Collectors.toList());
+
+        // 鏋勫缓鎵归噺鍒犻櫎鏉′欢
+        Wrapper<WarehouseGoodsShelvesRowcol> deleteWrapper = new LambdaQueryWrapper<WarehouseGoodsShelvesRowcol>()
+                .in(WarehouseGoodsShelvesRowcol::getWarehouseGoodsShelvesId, allShelvesIds);
+        warehouseGoodsShelvesRowcolService.remove(deleteWrapper);
+        return true;
+    }
+
+
+    @Override
+    public List<WarehouseGoodsShelvesDto> findList(WarehouseGoodsShelves warehouseGoodsShelves) {
+        return warehouseGoodsShelvesMapper.listAll(warehouseGoodsShelves);
+    }
+
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/warehouse/service/impl/WarehouseServiceImpl.java b/src/main/java/com/ruoyi/warehouse/service/impl/WarehouseServiceImpl.java
new file mode 100644
index 0000000..74276a7
--- /dev/null
+++ b/src/main/java/com/ruoyi/warehouse/service/impl/WarehouseServiceImpl.java
@@ -0,0 +1,175 @@
+package com.ruoyi.warehouse.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+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.framework.web.domain.AjaxResult;
+import com.ruoyi.warehouse.dto.WarehouseDto;
+import com.ruoyi.warehouse.dto.WarehouseGoodsShelvesDto;
+import com.ruoyi.warehouse.dto.WarehouseTreeDto;
+import com.ruoyi.warehouse.mapper.WarehouseGoodsShelvesMapper;
+import com.ruoyi.warehouse.mapper.WarehouseGoodsShelvesRowcolMapper;
+import com.ruoyi.warehouse.mapper.WarehouseMapper;
+import com.ruoyi.warehouse.pojo.Warehouse;
+import com.ruoyi.warehouse.pojo.WarehouseGoodsShelves;
+import com.ruoyi.warehouse.pojo.WarehouseGoodsShelvesRowcol;
+import com.ruoyi.warehouse.service.WarehouseGoodsShelvesService;
+import com.ruoyi.warehouse.service.WarehouseService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.sql.Array;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.springframework.beans.BeanUtils.copyProperties;
+
+/**
+* @author 86151
+* @description 閽堝琛ㄣ�恮arehouse(浠撳簱琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+* @createDate 2025-08-13 11:49:02
+*/
+@Service
+@Slf4j
+public class WarehouseServiceImpl extends ServiceImpl<WarehouseMapper, Warehouse>
+    implements WarehouseService {
+    @Autowired
+    private WarehouseMapper warehouseMapper;
+    @Autowired
+    private WarehouseGoodsShelvesService warehouseGoodsShelvesService;
+    @Autowired
+    private WarehouseGoodsShelvesMapper warehouseGoodsShelvesMapper;
+    @Autowired
+    private WarehouseGoodsShelvesRowcolMapper warehouseGoodsShelvesRowcolMapper;
+
+    @Override
+    public boolean deleteByIds(List<Long> ids) {
+        // 1. 妫�鏌ユ槸鍚︽湁璐ф灦
+        Wrapper<WarehouseGoodsShelves> queryWrapper = new LambdaQueryWrapper<WarehouseGoodsShelves>()
+                .in(WarehouseGoodsShelves::getWarehouseId, ids);
+        List<WarehouseGoodsShelves> shelvesList = warehouseGoodsShelvesService.list(queryWrapper);
+        //鑾峰緱shelvesList涓墍鏈夌殑Id
+
+        List<Long> shelvesIds = shelvesList.stream().map(WarehouseGoodsShelves::getId).collect(Collectors.toList());
+        // 2. 鍒犻櫎璐ф灦
+        if (!shelvesIds.isEmpty()) {
+            boolean b = warehouseGoodsShelvesService.deleteByIds(shelvesIds);
+            if (!b) {
+                throw new RuntimeException("鍒犻櫎璐ф灦澶辫触");
+            }
+        }
+        return removeByIds(ids);
+    }
+
+    @Override
+    public List<Warehouse> findList(Warehouse warehouse) {
+        return warehouseMapper.listAll(warehouse);
+    }
+    /**
+     * 鏌ヨ浠撳簱-璐ф灦-灞傚垪涓夌骇鏍戠粨鏋�
+     */
+    @Override
+    public List<WarehouseTreeDto> findListTree() {
+
+        // 鏌ヨ鎵�鏈夋牴鑺傜偣锛堜粨搴擄級
+        LambdaQueryWrapper<Warehouse> queryWrapper = new LambdaQueryWrapper<>();
+        // 鏌ヨ浠撳簱鍒楄〃锛堜竴绾ц妭鐐癸級
+        List<Warehouse> warehouseList = warehouseMapper.selectList(queryWrapper);
+
+        // 杞崲涓烘爲鑺傜偣骞舵瀯寤哄瓙鏍�
+        List<WarehouseTreeDto> tree = new ArrayList<>();
+        for (Warehouse warehouse : warehouseList) {
+            WarehouseTreeDto node = convertToWarehouseTreeDto(warehouse);
+            // 涓烘瘡涓粨搴撴坊鍔犺揣鏋跺瓙鑺傜偣
+            node.setChildren(buildShelfChildrenNodes(warehouse.getId()));
+            tree.add(node);
+        }
+        return tree;
+    }
+    /**
+     * 鏋勫缓璐ф灦瀛愯妭鐐癸紙浜岀骇鑺傜偣锛�
+     */
+    private List<WarehouseTreeDto> buildShelfChildrenNodes(Long warehouseId) {
+        // 鏌ヨ鎸囧畾浠撳簱涓嬬殑鎵�鏈夎揣鏋�
+        LambdaQueryWrapper<WarehouseGoodsShelves> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(WarehouseGoodsShelves::getWarehouseId, warehouseId);
+        List<WarehouseGoodsShelves> shelfList = warehouseGoodsShelvesMapper.selectList(queryWrapper);
+
+        // 杞崲涓烘爲鑺傜偣骞舵瀯寤哄眰鍒楀瓙鑺傜偣
+        List<WarehouseTreeDto> shelfNodes = new ArrayList<>();
+        for (WarehouseGoodsShelves shelf : shelfList) {
+            WarehouseTreeDto shelfNode = convertToShelfTreeDto(shelf);
+            // 涓烘瘡涓揣鏋舵坊鍔犲眰鍒楀瓙鑺傜偣
+            shelfNode.setChildren(buildRowcolChildrenNodes(shelf.getId()));
+            shelfNodes.add(shelfNode);
+        }
+
+        return shelfNodes;
+    }
+
+    /**
+     * 鏋勫缓灞傚垪瀛愯妭鐐癸紙涓夌骇鑺傜偣锛�
+     */
+    private List<WarehouseTreeDto> buildRowcolChildrenNodes(Long shelfId) {
+        // 鏌ヨ鎸囧畾璐ф灦涓嬬殑鎵�鏈夊眰鍒�
+        LambdaQueryWrapper<WarehouseGoodsShelvesRowcol> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(WarehouseGoodsShelvesRowcol::getWarehouseGoodsShelvesId, shelfId);
+        List<WarehouseGoodsShelvesRowcol> rowcolList = warehouseGoodsShelvesRowcolMapper.selectList(queryWrapper);
+
+        // 杞崲涓烘爲鑺傜偣锛堝眰鍒楁病鏈夊瓙鑺傜偣锛�
+        List<WarehouseTreeDto> rowcolNodes = new ArrayList<>();
+        for (WarehouseGoodsShelvesRowcol rowcol : rowcolList) {
+            WarehouseTreeDto rowcolNode = convertToRowcolTreeDto(rowcol);
+            rowcolNodes.add(rowcolNode);
+        }
+
+        return rowcolNodes;
+    }
+
+    /**
+     * 浠撳簱瀹炰綋杞崲涓烘爲鑺傜偣DTO
+     */
+    private WarehouseTreeDto convertToWarehouseTreeDto(Warehouse warehouse) {
+        WarehouseTreeDto dto = new WarehouseTreeDto();
+        copyProperties(warehouse, dto);
+        dto.setLabel(warehouse.getWarehouseName());
+        dto.setChildren(new ArrayList<>());
+        return dto;
+    }
+
+    /**
+     * 璐ф灦瀹炰綋杞崲涓烘爲鑺傜偣DTO
+     */
+    private WarehouseTreeDto convertToShelfTreeDto(WarehouseGoodsShelves shelf) {
+        WarehouseTreeDto dto = new WarehouseTreeDto();
+        copyProperties(shelf, dto);
+//        dto.setLabel(shelf.getGoodsShelvesName());
+        dto.setLabel(shelf.getName());
+        dto.setChildren(new ArrayList<>());
+        return dto;
+    }
+
+    /**
+     * 灞傚垪瀹炰綋杞崲涓烘爲鑺傜偣DTO
+     */
+    private WarehouseTreeDto convertToRowcolTreeDto(WarehouseGoodsShelvesRowcol rowcol) {
+        WarehouseTreeDto dto = new WarehouseTreeDto();
+        copyProperties(rowcol, dto);
+//        dto.setLabel(rowcol.getStorey() + "-" + rowcol.getArrange());
+        dto.setLabel(rowcol.getRow() + "-" + rowcol.getCol());
+        dto.setChildren(new ArrayList<>());
+        return dto;
+    }
+
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/waterrecord/controller/WaterRecordController.java b/src/main/java/com/ruoyi/waterrecord/controller/WaterRecordController.java
new file mode 100644
index 0000000..a963aa1
--- /dev/null
+++ b/src/main/java/com/ruoyi/waterrecord/controller/WaterRecordController.java
@@ -0,0 +1,91 @@
+package com.ruoyi.waterrecord.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.waterrecord.pojo.WaterRecord;
+import com.ruoyi.waterrecord.service.WaterRecordService;
+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 org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * @author :yys
+ * @date : 2025/8/11 10:08
+ */
+@RestController
+@Api(tags = "鐢ㄦ按绠$悊")
+@RequestMapping("/waterRecord")
+public class WaterRecordController extends BaseController {
+
+    @Autowired
+    private WaterRecordService waterRecordService;
+
+    @GetMapping("/listPage")
+    @Log(title = "鐢ㄦ按绠$悊-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
+    public AjaxResult listPage(Page page, WaterRecord waterRecord){
+        IPage<WaterRecord> listPage = waterRecordService.listPage(page, waterRecord);
+        return AjaxResult.success(listPage);
+    }
+
+    @PostMapping("/add")
+    @Log(title = "鐢ㄦ按绠$悊-鏂板", businessType = BusinessType.INSERT)
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult add(@RequestBody WaterRecord waterRecord){
+        boolean save = waterRecordService.save(waterRecord);
+        return save ? AjaxResult.success() : AjaxResult.error();
+    }
+
+    @PostMapping("/update")
+    @Log(title = "鐢ㄦ按绠$悊-淇敼", businessType = BusinessType.UPDATE)
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult update(@RequestBody WaterRecord waterRecord){
+        boolean update = waterRecordService.updateById(waterRecord);
+        return update ? AjaxResult.success() : AjaxResult.error();
+    }
+
+    @DeleteMapping("/delete")
+    @Log(title = "鐢ㄦ按绠$悊-鍒犻櫎", businessType = BusinessType.DELETE)
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult delete(@RequestBody List<Long> ids){
+        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+        boolean delete = waterRecordService.removeBatchByIds(ids);
+        return delete ? AjaxResult.success() : AjaxResult.error();
+    }
+
+    /**
+     * 瀵煎叆鐢ㄦ按绠$悊
+     */
+    @Log(title = "瀵煎叆鐢ㄦ按绠$悊", businessType = BusinessType.IMPORT)
+    @PostMapping("/importData")
+    @ApiOperation("瀵煎叆鐢ㄦ按绠$悊")
+    public AjaxResult importData(MultipartFile file) throws Exception {
+        return waterRecordService.importData(file);
+    }
+
+    /**
+     * 瀵煎嚭鐢ㄦ按绠$悊
+     */
+    @Log(title = "瀵煎嚭鐢ㄦ按绠$悊", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    @ApiOperation("瀵煎嚭鐢ㄦ按绠$悊")
+    public void export(HttpServletResponse response) {
+        Page page = new Page(-1,-1);
+        WaterRecord waterRecord = new WaterRecord();
+        IPage<WaterRecord> listPage = waterRecordService.listPage(page, waterRecord);
+        ExcelUtil<WaterRecord> util = new ExcelUtil<WaterRecord>(WaterRecord.class);
+        util.exportExcel(response, listPage.getRecords() , "鐢ㄦ按绠$悊");
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/waterrecord/mapper/WaterRecordMapper.java b/src/main/java/com/ruoyi/waterrecord/mapper/WaterRecordMapper.java
new file mode 100644
index 0000000..d66c16f
--- /dev/null
+++ b/src/main/java/com/ruoyi/waterrecord/mapper/WaterRecordMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.waterrecord.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.waterrecord.pojo.WaterRecord;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @author :yys
+ * @date : 2025/8/11 10:06
+ */
+public interface WaterRecordMapper extends BaseMapper<WaterRecord> {
+
+    /**
+     * @param page
+     * @param waterRecord
+     * @return
+     */
+    IPage<WaterRecord> listPage(Page page,@Param("req") WaterRecord waterRecord);
+}
diff --git a/src/main/java/com/ruoyi/waterrecord/pojo/WaterRecord.java b/src/main/java/com/ruoyi/waterrecord/pojo/WaterRecord.java
new file mode 100644
index 0000000..e2c6e9b
--- /dev/null
+++ b/src/main/java/com/ruoyi/waterrecord/pojo/WaterRecord.java
@@ -0,0 +1,135 @@
+package com.ruoyi.waterrecord.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.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * @author :yys
+ * @date : 2025/8/11 10:00
+ */
+@Data
+@TableName("water_record")
+@ApiModel
+public class WaterRecord {
+
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 瑙勬牸鍨嬪彿
+     */
+    @ApiModelProperty("瑙勬牸鍨嬪彿")
+    @Excel(name = "瑙勬牸鍨嬪彿")
+    private String deviceModel;
+
+    /**
+     * 鐢ㄦ按绫诲瀷
+     */
+    @ApiModelProperty("鐢ㄦ按绫诲瀷")
+    @Excel(name = "鐢ㄦ按绫诲瀷", readConverterExp = "industrial=宸ヤ笟鐢ㄦ按,domestic=鐢熸椿鐢ㄦ按,fire=娑堥槻鐢ㄦ按,greening=缁垮寲鐢ㄦ按")
+    private String type;
+
+    /**
+     * 璁惧鍚嶇О
+     */
+    @ApiModelProperty("璁惧鍚嶇О")
+    @Excel(name = "璁惧鍚嶇О")
+    @TableField(exist = false)
+    private String deviceName;
+
+
+
+    /**
+     * 棰濆畾娴侀噺
+     */
+    @ApiModelProperty("棰濆畾娴侀噺")
+    @Excel(name = "棰濆畾娴侀噺")
+    private String ratedRate;
+
+    /**
+     * 瀹為檯娴侀噺
+     */
+    @ApiModelProperty("瀹為檯娴侀噺")
+    @Excel(name = "瀹為檯娴侀噺")
+    private String actualTraffic;
+
+    /**
+     * 杩愯鏃堕棿
+     */
+    @ApiModelProperty("杩愯鏃堕棿")
+    @Excel(name = "杩愯鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private Date runTime;
+
+
+    /**
+     * 褰撴棩鐢ㄦ按閲�
+     */
+    @ApiModelProperty("褰撴棩鐢ㄦ按閲�")
+    @Excel(name = "褰撴棩鐢ㄦ按閲�")
+    private String waterDay;
+
+    /**
+     * 姣忔棩闄愬埗姘撮噺
+     */
+    @ApiModelProperty("姣忔棩闄愬埗姘撮噺")
+    @Excel(name = "姣忔棩闄愬埗姘撮噺")
+    private String waterDayLimit;
+
+    /**
+     * 姘磋垂鍗曚环
+     */
+    @ApiModelProperty("姘磋垂鍗曚环")
+    @Excel(name = "姘磋垂鍗曚环")
+    private String waterPrice;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty("澶囨敞")
+    private String remarks;
+
+    /**
+     * 鍒涘缓鑰�
+     */
+    @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;
+
+}
diff --git a/src/main/java/com/ruoyi/waterrecord/service/WaterRecordService.java b/src/main/java/com/ruoyi/waterrecord/service/WaterRecordService.java
new file mode 100644
index 0000000..775fb25
--- /dev/null
+++ b/src/main/java/com/ruoyi/waterrecord/service/WaterRecordService.java
@@ -0,0 +1,25 @@
+package com.ruoyi.waterrecord.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.framework.web.domain.AjaxResult;
+import com.ruoyi.waterrecord.pojo.WaterRecord;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * @author :yys
+ * @date : 2025/8/11 10:07
+ */
+public interface WaterRecordService extends IService<WaterRecord> {
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param page
+     * @param waterRecord
+     * @return
+     */
+    IPage<WaterRecord> listPage(Page page, WaterRecord waterRecord);
+
+    AjaxResult importData(MultipartFile file);
+}
diff --git a/src/main/java/com/ruoyi/waterrecord/service/impl/WaterRecordServiceImpl.java b/src/main/java/com/ruoyi/waterrecord/service/impl/WaterRecordServiceImpl.java
new file mode 100644
index 0000000..4359ea8
--- /dev/null
+++ b/src/main/java/com/ruoyi/waterrecord/service/impl/WaterRecordServiceImpl.java
@@ -0,0 +1,52 @@
+package com.ruoyi.waterrecord.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.equipmentenergyconsumption.pojo.EquipmentEnergyConsumption;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.waterrecord.mapper.WaterRecordMapper;
+import com.ruoyi.waterrecord.pojo.WaterRecord;
+import com.ruoyi.waterrecord.service.WaterRecordService;
+import lombok.extern.slf4j.Slf4j;
+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.util.List;
+
+/**
+ * @author :yys
+ * @date : 2025/8/11 10:08
+ */
+@Service
+@Slf4j
+public class WaterRecordServiceImpl extends ServiceImpl<WaterRecordMapper, WaterRecord> implements WaterRecordService {
+
+    @Autowired
+    private WaterRecordMapper waterRecordMapper;
+
+
+    @Override
+    public IPage<WaterRecord> listPage(Page page, WaterRecord waterRecord) {
+        return waterRecordMapper.listPage(page,waterRecord);
+    }
+
+    @Override
+    public AjaxResult importData(MultipartFile file) {
+        try {
+            ExcelUtil<WaterRecord> util = new ExcelUtil<WaterRecord>(WaterRecord.class);
+            List<WaterRecord> userList = util.importExcel(file.getInputStream());
+            if(CollectionUtils.isEmpty(userList)){
+                return AjaxResult.warn("妯℃澘閿欒鎴栧鍏ユ暟鎹负绌�");
+            }
+            this.saveOrUpdateBatch(userList);
+            return AjaxResult.success(true);
+        }catch (Exception e){
+            e.printStackTrace();
+            return AjaxResult.error("瀵煎叆澶辫触");
+        }
+    }
+}
diff --git a/src/main/resources/application-bdsm.yml b/src/main/resources/application-bdsm.yml
new file mode 100644
index 0000000..01b577d
--- /dev/null
+++ b/src/main/resources/application-bdsm.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9096
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: bdsm-product
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-bdsm?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.185
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 15
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-bhmy.yml b/src/main/resources/application-bhmy.yml
new file mode 100644
index 0000000..98636dd
--- /dev/null
+++ b/src/main/resources/application-bhmy.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9070
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: uploadPath
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-bhmy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.185
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 11
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-cjny.yml b/src/main/resources/application-cjny.yml
new file mode 100644
index 0000000..eedceb1
--- /dev/null
+++ b/src/main/resources/application-cjny.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9038
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: uploadPath
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-cjny?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 172.17.0.1
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 4
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-cmny.yml b/src/main/resources/application-cmny.yml
new file mode 100644
index 0000000..6239c56
--- /dev/null
+++ b/src/main/resources/application-cmny.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9088
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: uploadPath
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-cmny?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.185
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 12
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-demo.yml b/src/main/resources/application-demo.yml
index 1b1ddab..631eb3e 100644
--- a/src/main/resources/application-demo.yml
+++ b/src/main/resources/application-demo.yml
@@ -17,7 +17,7 @@
 # 寮�鍙戠幆澧冮厤缃�
 server:
   # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
-  port: 8089
+  port: 9036
   servlet:
     # 搴旂敤鐨勮闂矾寰�
     context-path: /
@@ -45,7 +45,7 @@
   accessKey: admin
   secretKey: 12345678
   preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
-  default-bucket: uploadPath
+  default-bucket: demo-product
 # 鐢ㄦ埛閰嶇疆
 user:
   password:
@@ -62,9 +62,9 @@
     druid:
       # 涓诲簱鏁版嵁婧�
       master:
-        url: jdbc:mysql://114.132.189.42:9004/product-inventory-management-demo?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-demo?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
         username: root
-        password: 123456
+        password: xd@123456..
       # 浠庡簱鏁版嵁婧�
       slave:
         # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
@@ -134,15 +134,15 @@
   # redis 閰嶇疆
   redis:
     # 鍦板潃
-    host: 127.0.0.1
-#    host: 172.17.0.1
+#    host: 127.0.0.1
+    host: 192.168.1.185
     # 绔彛锛岄粯璁や负6379
     port: 6379
     # 鏁版嵁搴撶储寮�
     database: 0
     # 瀵嗙爜
-    password: root2022!
-#    password:
+#    password: root2022!
+    password:
 
     # 杩炴帴瓒呮椂鏃堕棿
     timeout: 10s
@@ -188,7 +188,7 @@
 # Swagger閰嶇疆
 swagger:
   # 鏄惁寮�鍚痵wagger
-  enabled: false
+  enabled: true
   # 璇锋眰鍓嶇紑
   pathMapping: /dev-api
 
diff --git a/src/main/resources/application-dhdc.yml b/src/main/resources/application-dhdc.yml
new file mode 100644
index 0000000..52fbd62
--- /dev/null
+++ b/src/main/resources/application-dhdc.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9032
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: uploadPath
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.8:3306/product-inventory-management-dhdc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: 123456
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.8
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 1
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-hbkj.yml b/src/main/resources/application-hbkj.yml
new file mode 100644
index 0000000..bf9759c
--- /dev/null
+++ b/src/main/resources/application-hbkj.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9117
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: bdsm-product
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hbkj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.185
+    # 绔彛锛岄粯璁や负6379
+    port: 6380
+    # 鏁版嵁搴撶储寮�
+    database: 3
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-hbxm.yml b/src/main/resources/application-hbxm.yml
new file mode 100644
index 0000000..88fb4ee
--- /dev/null
+++ b/src/main/resources/application-hbxm.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9100
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: bdsm-product
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hbxm?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.185
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 13
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-hckx.yml b/src/main/resources/application-hckx.yml
new file mode 100644
index 0000000..cd680c8
--- /dev/null
+++ b/src/main/resources/application-hckx.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9090
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: uploadPath
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hckx?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.185
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 12
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-hcmy.yml b/src/main/resources/application-hcmy.yml
new file mode 100644
index 0000000..6aadf85
--- /dev/null
+++ b/src/main/resources/application-hcmy.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9103
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: bdsm-product
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hcmy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.185
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 15
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-hhkj.yml b/src/main/resources/application-hhkj.yml
new file mode 100644
index 0000000..0cde287
--- /dev/null
+++ b/src/main/resources/application-hhkj.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9046
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: uploadPath
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hhkj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.185
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 0
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-hsmy.yml b/src/main/resources/application-hsmy.yml
new file mode 100644
index 0000000..862214f
--- /dev/null
+++ b/src/main/resources/application-hsmy.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9115
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: bdsm-product
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hsmy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.185
+    # 绔彛锛岄粯璁や负6379
+    port: 6380
+    # 鏁版嵁搴撶储寮�
+    database: 2
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-hsxny.yml b/src/main/resources/application-hsxny.yml
new file mode 100644
index 0000000..d20674c
--- /dev/null
+++ b/src/main/resources/application-hsxny.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9101
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: uploadPath
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hsxny?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.185
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 12
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-hxgy.yml b/src/main/resources/application-hxgy.yml
new file mode 100644
index 0000000..aa429e9
--- /dev/null
+++ b/src/main/resources/application-hxgy.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9098
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: bdsm-product
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hxgy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.185
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 14
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-hxsj.yml b/src/main/resources/application-hxsj.yml
new file mode 100644
index 0000000..d756e6e
--- /dev/null
+++ b/src/main/resources/application-hxsj.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 8088
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: bdsm-product
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-hxsj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: hxsj@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 172.17.0.1
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 15
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-hysn.yml b/src/main/resources/application-hysn.yml
new file mode 100644
index 0000000..5d8f467
--- /dev/null
+++ b/src/main/resources/application-hysn.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9034
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: uploadPath
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hysn?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.185
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 5
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: false
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-jjxm.yml b/src/main/resources/application-jjxm.yml
new file mode 100644
index 0000000..a434f00
--- /dev/null
+++ b/src/main/resources/application-jjxm.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9107
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: bdsm-product
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-jjxm?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.185
+    # 绔彛锛岄粯璁や负6379
+    port: 6380
+    # 鏁版嵁搴撶储寮�
+    database: 0
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-jlsn.yml b/src/main/resources/application-jlsn.yml
new file mode 100644
index 0000000..d3be68c
--- /dev/null
+++ b/src/main/resources/application-jlsn.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9094
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: uploadPath
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-jlsn?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.185
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 13
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-jsmy.yml b/src/main/resources/application-jsmy.yml
new file mode 100644
index 0000000..df31410
--- /dev/null
+++ b/src/main/resources/application-jsmy.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9042
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: uploadPath
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-jsmy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 172.17.0.1
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 6
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-jsyny.yml b/src/main/resources/application-jsyny.yml
new file mode 100644
index 0000000..590ade8
--- /dev/null
+++ b/src/main/resources/application-jsyny.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9074
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: uploadPath
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-jsyny?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.185
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 12
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-jyhj.yml b/src/main/resources/application-jyhj.yml
new file mode 100644
index 0000000..55c4854
--- /dev/null
+++ b/src/main/resources/application-jyhj.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9030
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: uploadPath
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.193:3306/product-inventory-management-jyhj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: 123456
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.193
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 0
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-mkzs.yml b/src/main/resources/application-mkzs.yml
new file mode 100644
index 0000000..85368ae
--- /dev/null
+++ b/src/main/resources/application-mkzs.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9111
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: bdsm-product
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-mkzs?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.185
+    # 绔彛锛岄粯璁や负6379
+    port: 6380
+    # 鏁版嵁搴撶储寮�
+    database: 1
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-mqsp.yml b/src/main/resources/application-mqsp.yml
new file mode 100644
index 0000000..05264b0
--- /dev/null
+++ b/src/main/resources/application-mqsp.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9123
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: bdsm-product
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-lqmsp?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.185
+    # 绔彛锛岄粯璁や负6379
+    port: 6380
+    # 鏁版嵁搴撶储寮�
+    database: 6
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-mxsc.yml b/src/main/resources/application-mxsc.yml
new file mode 100644
index 0000000..051b575
--- /dev/null
+++ b/src/main/resources/application-mxsc.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9048
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: uploadPath
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-mxsc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.185
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 0
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-nydl.yml b/src/main/resources/application-nydl.yml
new file mode 100644
index 0000000..7d9428e
--- /dev/null
+++ b/src/main/resources/application-nydl.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9104
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: bdsm-product
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.0.182:3306/product-inventory-management-nydl?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: HpencZdyK7WrtQvBUKnr
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.0.182
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 0
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-phmk.yml b/src/main/resources/application-phmk.yml
new file mode 100644
index 0000000..e2e7049
--- /dev/null
+++ b/src/main/resources/application-phmk.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9119
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: bdsm-product
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-phmk?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.185
+    # 绔彛锛岄粯璁や负6379
+    port: 6380
+    # 鏁版嵁搴撶储寮�
+    database: 4
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml
index d84f05d..7c4b412 100644
--- a/src/main/resources/application-prod.yml
+++ b/src/main/resources/application-prod.yml
@@ -135,6 +135,7 @@
   redis:
     # 鍦板潃
     host: 127.0.0.1
+#    host: localhost
 #    host: 172.17.0.1
     # 绔彛锛岄粯璁や负6379
     port: 6379
diff --git a/src/main/resources/application-qlmc.yml b/src/main/resources/application-qlmc.yml
new file mode 100644
index 0000000..3b8c0d0
--- /dev/null
+++ b/src/main/resources/application-qlmc.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 8090
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: bdsm-product
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-qlmc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: qlmc@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 172.17.0.1
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 15
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-rzny.yml b/src/main/resources/application-rzny.yml
new file mode 100644
index 0000000..b5673ce
--- /dev/null
+++ b/src/main/resources/application-rzny.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9058
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: uploadPath
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-rzny?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.185
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 0
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-tjxm.yml b/src/main/resources/application-tjxm.yml
new file mode 100644
index 0000000..a928f2e
--- /dev/null
+++ b/src/main/resources/application-tjxm.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9064
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: uploadPath
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-tjxm?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.185
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 9
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-tymk.yml b/src/main/resources/application-tymk.yml
new file mode 100644
index 0000000..37fa56e
--- /dev/null
+++ b/src/main/resources/application-tymk.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9121
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: bdsm-product
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-tymk?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.185
+    # 绔彛锛岄粯璁や负6379
+    port: 6380
+    # 鏁版嵁搴撶储寮�
+    database: 5
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-wdsy.yml b/src/main/resources/application-wdsy.yml
index 6ac3309..b55f3fb 100644
--- a/src/main/resources/application-wdsy.yml
+++ b/src/main/resources/application-wdsy.yml
@@ -134,15 +134,15 @@
   # redis 閰嶇疆
   redis:
     # 鍦板潃
-    host: 127.0.0.1
-#    host: 172.17.0.1
+#    host: 127.0.0.1
+    host: 172.17.0.1
     # 绔彛锛岄粯璁や负6379
-    port: 6379
+    port: 6380
     # 鏁版嵁搴撶储寮�
-    database: 3
+    database: 2
     # 瀵嗙爜
-    password: root2022!
-#    password:
+#    password: root2022!
+    password:
 
     # 杩炴帴瓒呮椂鏃堕棿
     timeout: 10s
diff --git a/src/main/resources/application-xyhb.yml b/src/main/resources/application-xyhb.yml
new file mode 100644
index 0000000..5ce974a
--- /dev/null
+++ b/src/main/resources/application-xyhb.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9052
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: uploadPath
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-xyhb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.185
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 8
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-zjyj.yml b/src/main/resources/application-zjyj.yml
index 4bafeb7..e6e4b6a 100644
--- a/src/main/resources/application-zjyj.yml
+++ b/src/main/resources/application-zjyj.yml
@@ -134,15 +134,15 @@
   # redis 閰嶇疆
   redis:
     # 鍦板潃
-    host: 127.0.0.1
-#    host: 172.17.0.1
+#    host: 127.0.0.1
+    host: 172.17.0.1
     # 绔彛锛岄粯璁や负6379
-    port: 6379
+    port: 6380
     # 鏁版嵁搴撶储寮�
-    database: 3
+    database: 0
     # 瀵嗙爜
-    password: root2022!
-#    password:
+#    password: root2022!
+    password:
 
     # 杩炴帴瓒呮椂鏃堕棿
     timeout: 10s
diff --git a/src/main/resources/application-zqhx.yml b/src/main/resources/application-zqhx.yml
index a32d6fb..3a6cf4d 100644
--- a/src/main/resources/application-zqhx.yml
+++ b/src/main/resources/application-zqhx.yml
@@ -134,15 +134,15 @@
   # redis 閰嶇疆
   redis:
     # 鍦板潃
-    host: 127.0.0.1
-#    host: 172.17.0.1
+#    host: 127.0.0.1
+    host: 172.17.0.1
     # 绔彛锛岄粯璁や负6379
-    port: 6379
+    port: 6380
     # 鏁版嵁搴撶储寮�
-    database: 3
+    database: 1
     # 瀵嗙爜
-    password: root2022!
-#    password:
+#    password: root2022!
+    password:
 
     # 杩炴帴瓒呮椂鏃堕棿
     timeout: 10s
diff --git a/src/main/resources/application-zyrq.yml b/src/main/resources/application-zyrq.yml
new file mode 100644
index 0000000..9030508
--- /dev/null
+++ b/src/main/resources/application-zyrq.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9030
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: demo-product
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.10.230:3306/product-inventory-management-zyrq?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: zyrq@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.10.230
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 0
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application-zyrqCopy.yml b/src/main/resources/application-zyrqCopy.yml
new file mode 100644
index 0000000..5e7f50b
--- /dev/null
+++ b/src/main/resources/application-zyrqCopy.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9030
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: demo-product
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-zyrq?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xd@123456..
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.185
+    # 绔彛锛岄粯璁や负6379
+    port: 6380
+    # 鏁版嵁搴撶储寮�
+    database: 5
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/mapper/account/AccountFileMapper.xml b/src/main/resources/mapper/account/AccountFileMapper.xml
index 8def6e1..86266d5 100644
--- a/src/main/resources/mapper/account/AccountFileMapper.xml
+++ b/src/main/resources/mapper/account/AccountFileMapper.xml
@@ -7,6 +7,9 @@
         FROM account_file
         where
         1=1
+        <if test="accountFile.accountId != null and accountFile.accountId != ''">
+            AND account_id = #{accountFile.accountId}
+        </if>
         <if test="accountFile.name != null and accountFile.name != '' ">
             AND name = #{accountFile.name}
         </if>
diff --git a/src/main/resources/mapper/approve/AnnualLeaveSettingMapper.xml b/src/main/resources/mapper/approve/AnnualLeaveSettingMapper.xml
new file mode 100644
index 0000000..39fcb3f
--- /dev/null
+++ b/src/main/resources/mapper/approve/AnnualLeaveSettingMapper.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.approve.mapper.AnnualLeaveSettingMapper">
+
+
+    <select id="listPage" resultType="com.ruoyi.approve.pojo.AnnualLeaveSetting">
+        select * from annual_leave_setting
+        where 1=1
+        <if test="annualLeaveSetting.employeeType != null">
+            and employee_type = #{annualLeaveSetting.employeeType}
+        </if>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/approve/ApproveProcessMapper.xml b/src/main/resources/mapper/approve/ApproveProcessMapper.xml
index 0ab3d21..33b29a9 100644
--- a/src/main/resources/mapper/approve/ApproveProcessMapper.xml
+++ b/src/main/resources/mapper/approve/ApproveProcessMapper.xml
@@ -35,5 +35,8 @@
         <if test="req.approveStatus != null or req.approveStatus == 0">
             and approve_status = #{req.approveStatus}
         </if>
+        <if test="req.approveType != null ">
+            and approve_type = #{req.approveType}
+        </if>
     </select>
 </mapper>
diff --git a/src/main/resources/mapper/approve/FileSharingMapper.xml b/src/main/resources/mapper/approve/FileSharingMapper.xml
new file mode 100644
index 0000000..cd62025
--- /dev/null
+++ b/src/main/resources/mapper/approve/FileSharingMapper.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.approve.mapper.FileSharingMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/approve/HolidaySettingsMapper.xml b/src/main/resources/mapper/approve/HolidaySettingsMapper.xml
new file mode 100644
index 0000000..ac5f19e
--- /dev/null
+++ b/src/main/resources/mapper/approve/HolidaySettingsMapper.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.approve.mapper.HolidaySettingsMapper">
+
+    <select id="listpage" resultType="com.ruoyi.approve.pojo.HolidaySettings">
+        select * from holiday_settings
+        where 1=1
+        <if test="holidaySettings.type != null">
+            and type = #{holidaySettings.type}
+        </if>
+        <if test="holidaySettings.name != null">
+            and name like concat('%',#{holidaySettings.name},'%')
+        </if>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/approve/KnowledgeBaseMapper.xml b/src/main/resources/mapper/approve/KnowledgeBaseMapper.xml
new file mode 100644
index 0000000..e4819c2
--- /dev/null
+++ b/src/main/resources/mapper/approve/KnowledgeBaseMapper.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.approve.mapper.KnowledgeBaseMapper">
+
+
+    <select id="listpage" resultType="com.ruoyi.approve.pojo.KnowledgeBase">
+        select * from knowledge_base
+        <where>
+            1=1
+            <if test="knowledgeBase.title != null and knowledgeBase.title != ''">
+                and title like concat('%',#{knowledgeBase.title},'%')
+            </if>
+            <if test="knowledgeBase.type != null and knowledgeBase.type != ''">
+                and type = #{knowledgeBase.type}
+            </if>
+        </where>
+
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/approve/NotificationManagementMapper.xml b/src/main/resources/mapper/approve/NotificationManagementMapper.xml
new file mode 100644
index 0000000..a2e714f
--- /dev/null
+++ b/src/main/resources/mapper/approve/NotificationManagementMapper.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.approve.mapper.NotificationManagementMapper">
+
+    <select id="listpage" resultType="com.ruoyi.approve.pojo.NotificationManagement">
+        select * from notification_management
+        <where>
+            1=1
+            <if test="notificationManagement.title != null and notificationManagement.title != ''">
+                and title like concat('%',#{notificationManagement.title},'%')
+            </if>
+            <if test="notificationManagement.type != null">
+                and type = #{notificationManagement.type}
+            </if>
+        </where>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/approve/OnlineMeetingMapper.xml b/src/main/resources/mapper/approve/OnlineMeetingMapper.xml
new file mode 100644
index 0000000..5ce6d5d
--- /dev/null
+++ b/src/main/resources/mapper/approve/OnlineMeetingMapper.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.approve.mapper.OnlineMeetingMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/approve/OvertimeSettingMapper.xml b/src/main/resources/mapper/approve/OvertimeSettingMapper.xml
new file mode 100644
index 0000000..b496353
--- /dev/null
+++ b/src/main/resources/mapper/approve/OvertimeSettingMapper.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.approve.mapper.OvertimeSettingMapper">
+
+
+    <select id="listPage" resultType="com.ruoyi.approve.pojo.OvertimeSetting">
+        select * from overtime_setting
+        where 1=1
+        <if test="overtimeSetting.type != null">
+            and type = #{overtimeSetting.type}
+        </if>
+        <if test="overtimeSetting.name != null and overtimeSetting.name !=''">
+            and name like concat('%',#{overtimeSetting.name},'%')
+        </if>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/approve/RpaProcessAutomationMapper.xml b/src/main/resources/mapper/approve/RpaProcessAutomationMapper.xml
new file mode 100644
index 0000000..4471d61
--- /dev/null
+++ b/src/main/resources/mapper/approve/RpaProcessAutomationMapper.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.approve.mapper.RpaProcessAutomationMapper">
+
+    <select id="listpage" resultType="com.ruoyi.approve.pojo.RpaProcessAutomation">
+        select * from rpa_process_automation
+        <where>
+        1=1
+            <if test="rpaProcessAutomation.programName != null and rpaProcessAutomation.programName != ''">
+                and program_name like concat('%',#{rpaProcessAutomation.programName},'%')
+            </if>
+            <if test="rpaProcessAutomation.status != null">
+                and status = #{rpaProcessAutomation.status}
+            </if>
+        </where>
+    </select>
+</mapper>
diff --git a/src/main/resources/mapper/approve/WorkingHoursSettingMapper.xml b/src/main/resources/mapper/approve/WorkingHoursSettingMapper.xml
new file mode 100644
index 0000000..63bc1c3
--- /dev/null
+++ b/src/main/resources/mapper/approve/WorkingHoursSettingMapper.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.approve.mapper.WorkingHoursSettingMapper">
+
+
+    <select id="listPage" resultType="com.ruoyi.approve.pojo.WorkingHoursSetting">
+        select * from working_hours_setting
+        where 1=1
+        <if test="workingHoursSetting.name != null and workingHoursSetting.name !=''">
+            and name like concat('%',#{workingHoursSetting.name},'%')
+        </if>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/collaborativeApproval/DutyPlanMapper.xml b/src/main/resources/mapper/collaborativeApproval/DutyPlanMapper.xml
new file mode 100644
index 0000000..6c1679d
--- /dev/null
+++ b/src/main/resources/mapper/collaborativeApproval/DutyPlanMapper.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.collaborativeApproval.mapper.DutyPlanMapper">
+    <resultMap id="DutyPlanDTOMap" type="com.ruoyi.collaborativeApproval.dto.DutyPlanDTO">
+        <result column="id" property="id"/>
+        <result column="tags" property="tags" typeHandler="com.ruoyi.approve.utils.ListToStringTypeHandler"/>
+    </resultMap>
+
+    <select id="listPage" resultMap="DutyPlanDTOMap">
+        select * from duty_plan
+        <where>
+        1=1
+            <if test="dutyPlan.title != null and dutyPlan.title != ''">
+                and title like concat('%',#{dutyPlan.title},'%')
+            </if>
+            <if test="dutyPlan.level != null">
+                and level = #{dutyPlan.level}
+            </if>
+            <if test="dutyPlan.period != null">
+                and period = #{dutyPlan.period}
+            </if>
+            <if test="dutyPlan.queryDate != null">
+                and start_date &lt;= #{dutyPlan.queryDate}
+                and end_date &gt;= #{dutyPlan.queryDate}
+            </if>
+        </where>
+    </select>
+
+    <select id="getNum" resultType="java.util.Map">
+        SELECT
+            level,
+            COUNT(*) AS num,
+            ROUND(COUNT(*) / total.count * 100) AS completion
+        FROM
+            duty_plan,
+            (SELECT COUNT(*) AS count FROM duty_plan) AS total
+        GROUP BY
+            level, total.count
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/collaborativeApproval/MeetApplicationMapper.xml b/src/main/resources/mapper/collaborativeApproval/MeetApplicationMapper.xml
new file mode 100644
index 0000000..a195317
--- /dev/null
+++ b/src/main/resources/mapper/collaborativeApproval/MeetApplicationMapper.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.collaborativeApproval.mapper.MeetApplicationMapper">
+
+    <resultMap id="BaseResultMap" type="com.ruoyi.collaborativeApproval.pojo.MeetApplication">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="title" column="title" jdbcType="VARCHAR"/>
+            <result property="type" column="type" jdbcType="VARCHAR"/>
+            <result property="roomId" column="room_id" jdbcType="BIGINT"/>
+            <result property="host" column="host" jdbcType="VARCHAR"/>
+            <result property="meetingDate" column="meeting_date" jdbcType="DATE"/>
+            <result property="startTime" column="start_time" jdbcType="TIMESTAMP"/>
+            <result property="endTime" column="end_time" jdbcType="TIMESTAMP"/>
+            <result property="participants" column="participants" jdbcType="VARCHAR"/>
+            <result property="description" column="description" jdbcType="VARCHAR"/>
+            <result property="applicationType" column="application_type" jdbcType="VARCHAR"/>
+            <result property="status" column="status" jdbcType="TINYINT"/>
+            <result property="applicant" column="applicant" jdbcType="VARCHAR"/>
+            <result property="createUser" column="create_user" jdbcType="BIGINT"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateUser" column="update_user" jdbcType="BIGINT"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="tenantId" column="tenant_id" jdbcType="BIGINT"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,title,type,
+        room_id,host,meeting_date,
+        start_time,end_time,participants,
+        description,application_type,status,
+        applicant,create_user,create_time,
+        update_user,update_time,tenant_id
+    </sql>
+    <select id="getMeetSummary" resultType="com.ruoyi.collaborativeApproval.dto.MeetSummaryDto">
+        SELECT
+        COUNT(*) AS total,
+        SUM(CASE
+        WHEN meeting_date = CURDATE() AND start_time <![CDATA[<=]]> NOW() AND end_time <![CDATA[>]]> NOW()
+        THEN 1 ELSE 0
+        END) AS underWay,
+        SUM(CASE
+        WHEN (meeting_date <![CDATA[<]]> CURDATE() OR (meeting_date = CURDATE() AND end_time <![CDATA[<=]]> NOW()))
+        THEN 1 ELSE 0
+        END) AS completed,
+        SUM(CASE
+        WHEN meeting_date <![CDATA[>=]]> CURDATE() AND start_time <![CDATA[>]]> NOW()
+        THEN 1 ELSE 0
+        END) AS toStart
+        FROM meet_application as t1
+        where status = 1 OR application_type='notification'
+    </select>
+    <select id="getMeetSummaryItems" resultType="com.ruoyi.collaborativeApproval.dto.MeetingSimpleDto">
+        select t1.id                                  as id,
+        t1.title                               as title,
+        (CASE
+        WHEN t1.meeting_date = CURDATE() AND t1.start_time <![CDATA[<=]]>  NOW() AND t1.end_time <![CDATA[>]]>  NOW()
+        THEN 2
+        WHEN t1.meeting_date <![CDATA[>=]]>  CURDATE() AND t1.start_time <![CDATA[>]]>  NOW() then 1
+        ELSE 0 end)                       as status,
+        t1.start_time                          as start_time,
+        t1.end_time                            as end_time,
+        CONCAT(t2.name, '(', t2.location, ')') as location,
+        t1.host as host,
+        t1.participants as participants,
+        t3.content as content
+        from meet_application
+        as t1
+        left join meeting_room as t2 on t1.room_id = t2.id
+        left join meeting_minutes as t3 on t1.id = t3.meeting_id
+        where t1.status = 1
+        OR t1.application_type = 'notification'
+        order by (CASE
+        WHEN t1.meeting_date = CURDATE() AND t1.start_time <![CDATA[<=]]>  NOW() AND t1.end_time <![CDATA[>]]>  NOW()
+        THEN 2
+        WHEN t1.meeting_date <![CDATA[>=]]>  CURDATE() AND t1.start_time > NOW() then 1
+        ELSE 0 end) desc, t1.end_time desc
+    </select>
+</mapper>
diff --git a/src/main/resources/mapper/collaborativeApproval/MeetDraftMapper.xml b/src/main/resources/mapper/collaborativeApproval/MeetDraftMapper.xml
new file mode 100644
index 0000000..3b2c86a
--- /dev/null
+++ b/src/main/resources/mapper/collaborativeApproval/MeetDraftMapper.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.collaborativeApproval.mapper.MeetDraftMapper">
+
+    <resultMap id="BaseResultMap" type="com.ruoyi.collaborativeApproval.pojo.MeetDraft">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="roomId" column="room_id" jdbcType="BIGINT"/>
+            <result property="title" column="title" jdbcType="VARCHAR"/>
+            <result property="host" column="host" jdbcType="VARCHAR"/>
+            <result property="meetingDate" column="meeting_date" jdbcType="DATE"/>
+            <result property="startTime" column="start_time" jdbcType="TIMESTAMP"/>
+            <result property="endTime" column="end_time" jdbcType="TIMESTAMP"/>
+            <result property="participants" column="participants" jdbcType="INTEGER"/>
+            <result property="participantList" column="participant_list" jdbcType="VARCHAR"/>
+            <result property="description" column="description" jdbcType="VARCHAR"/>
+            <result property="creator" column="creator" jdbcType="VARCHAR"/>
+            <result property="createUser" column="create_user" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateUser" column="update_user" jdbcType="VARCHAR"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="tenantId" column="tenant_id" jdbcType="BIGINT"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,room_id,title,
+        host,meeting_date,start_time,
+        end_time,participants,participant_list,
+        description,creator,create_user,
+        create_time,update_user,update_time,
+        tenant_id
+    </sql>
+</mapper>
diff --git a/src/main/resources/mapper/collaborativeApproval/MeetingMinutesMapper.xml b/src/main/resources/mapper/collaborativeApproval/MeetingMinutesMapper.xml
new file mode 100644
index 0000000..5904e3a
--- /dev/null
+++ b/src/main/resources/mapper/collaborativeApproval/MeetingMinutesMapper.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.collaborativeApproval.mapper.MeetingMinutesMapper">
+
+    <resultMap id="BaseResultMap" type="com.ruoyi.collaborativeApproval.pojo.MeetingMinutes">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="meetingId" column="meeting_id" jdbcType="BIGINT"/>
+            <result property="title" column="title" jdbcType="VARCHAR"/>
+            <result property="content" column="content" jdbcType="VARCHAR"/>
+            <result property="createUser" column="create_user" jdbcType="BIGINT"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateUser" column="update_user" jdbcType="BIGINT"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="tenantId" column="tenant_id" jdbcType="BIGINT"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,meeting_id,title,
+        content,create_user,create_time,
+        update_user,update_time,tenant_id
+    </sql>
+</mapper>
diff --git a/src/main/resources/mapper/collaborativeApproval/MeetingRoomMapper.xml b/src/main/resources/mapper/collaborativeApproval/MeetingRoomMapper.xml
new file mode 100644
index 0000000..feac888
--- /dev/null
+++ b/src/main/resources/mapper/collaborativeApproval/MeetingRoomMapper.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.collaborativeApproval.mapper.MeetingRoomMapper">
+
+    <resultMap id="BaseResultMap" type="com.ruoyi.collaborativeApproval.pojo.MeetingRoom">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="name" column="name" jdbcType="VARCHAR"/>
+            <result property="location" column="location" jdbcType="VARCHAR"/>
+            <result property="capacity" column="capacity" jdbcType="INTEGER"/>
+            <result property="equipment" column="equipment" jdbcType="VARCHAR"/>
+            <result property="status" column="status" jdbcType="TINYINT"/>
+            <result property="remark" column="remark" jdbcType="VARCHAR"/>
+            <result property="createUser" column="create_user" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateUser" column="update_user" jdbcType="VARCHAR"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="tenantId" column="tenant_id" jdbcType="BIGINT"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,name,location,
+        capacity,equipment,status,
+        remark,create_user,create_time,
+        update_user,update_time,tenant_id
+    </sql>
+</mapper>
diff --git a/src/main/resources/mapper/collaborativeApproval/NoticeMapper.xml b/src/main/resources/mapper/collaborativeApproval/NoticeMapper.xml
new file mode 100644
index 0000000..5f646ad
--- /dev/null
+++ b/src/main/resources/mapper/collaborativeApproval/NoticeMapper.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.collaborativeApproval.mapper.NoticeMapper">
+
+    <select id="listPage" resultType="com.ruoyi.collaborativeApproval.dto.NoticeDTO">
+        select n.*, su.user_name as create_user_name
+        from notice n
+        left join sys_user su on n.create_user = su.user_id
+        <where>
+            <if test="ew.title != null and ew.title != ''">
+                and n.title like concat('%',#{ew.title},'%')
+            </if>
+            <if test="ew.type != null">
+                and n.type = #{ew.type}
+            </if>
+            <if test="ew.status != null">
+                and n.status = #{ew.status}
+            </if>
+        </where>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/collaborativeApproval/ReadingStatusMapper.xml b/src/main/resources/mapper/collaborativeApproval/ReadingStatusMapper.xml
new file mode 100644
index 0000000..c61f17d
--- /dev/null
+++ b/src/main/resources/mapper/collaborativeApproval/ReadingStatusMapper.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.collaborativeApproval.mapper.ReadingStatusMapper">
+
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/collaborativeApproval/RulesRegulationsManagementMapper.xml b/src/main/resources/mapper/collaborativeApproval/RulesRegulationsManagementMapper.xml
new file mode 100644
index 0000000..03dc024
--- /dev/null
+++ b/src/main/resources/mapper/collaborativeApproval/RulesRegulationsManagementMapper.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.collaborativeApproval.mapper.RulesRegulationsManagementMapper">
+    <resultMap id="RulesRegulationsManagementDTOMap" type="com.ruoyi.collaborativeApproval.dto.RulesRegulationsManagementDTO">
+        <!-- 鍏朵粬瀛楁鏄犲皠锛堜繚鎸佷笉鍙橈級 -->
+        <result column="id" property="id"/>
+        <result column="regulation_num" property="regulationNum"/>
+        <result column="title" property="title"/>
+        <!-- ... 鐪佺暐鍏朵粬瀛楁 ... -->
+
+        <!-- 鍏抽敭淇锛氫负 scope 瀛楁鎸囧畾绫诲瀷澶勭悊鍣� -->
+        <result column="scope" property="scope" typeHandler="com.ruoyi.approve.utils.ListToStringTypeHandler"/>
+    </resultMap>
+
+    <select id="listPage" resultMap="RulesRegulationsManagementDTOMap">
+        select rrm.*, su.user_name as create_user_name
+        from rules_regulations_management rrm
+        left join sys_user su on rrm.create_user = su.user_id
+        <where>
+            <if test="ew.regulationNum != null and ew.regulationNum != ''">
+                and rrm.regulation_num = #{ew.regulationNum}
+            </if>
+            <if test="ew.title != null and ew.title != ''">
+                and rrm.title like concat('%',#{ew.title},'%')
+            </if>
+            <if test="ew.category != null">
+                and rrm.category = #{ew.category}
+            </if>
+        </where>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/collaborativeApproval/SealApplicationManagementMapper.xml b/src/main/resources/mapper/collaborativeApproval/SealApplicationManagementMapper.xml
new file mode 100644
index 0000000..b8ad6a7
--- /dev/null
+++ b/src/main/resources/mapper/collaborativeApproval/SealApplicationManagementMapper.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.collaborativeApproval.mapper.SealApplicationManagementMapper">
+
+
+    <select id="listPage" resultType="com.ruoyi.collaborativeApproval.dto.SealApplicationManagementDTO">
+        select sam.*, su.user_name as create_user_name, d.dept_name as department
+        from seal_application_management sam
+        left join sys_user su on sam.create_user = su.user_id
+        left join sys_user_dept sud on su.user_id = sud.user_id
+        left join sys_dept d on sud.dept_id = d.dept_id
+        <where>
+            <if test="ew.title != null and ew.title != ''">
+                and sam.title like concat('%',#{ew.title},'%')
+            </if>
+            <if test="ew.status != null">
+                and sam.status = #{ew.status}
+            </if>
+        </where>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/collaborativeApproval/StaffContactsPersonalMapper.xml b/src/main/resources/mapper/collaborativeApproval/StaffContactsPersonalMapper.xml
new file mode 100644
index 0000000..36ce60d
--- /dev/null
+++ b/src/main/resources/mapper/collaborativeApproval/StaffContactsPersonalMapper.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.collaborativeApproval.mapper.StaffContactsPersonalMapper">
+
+
+    <select id="listPage" resultType="com.ruoyi.collaborativeApproval.dto.StaffContactsPersonalDTO">
+        SELECT
+            scp.id,
+            scp.contact_id,
+            sjlr.staff_no,
+            sjlr.staff_name,
+            sjlr.sex,
+            sjlr.post_job,
+            sjlr.adress,
+            sjlr.profession,
+            sjlr.identity_card,
+            sjlr.phone,
+            scp.create_time
+        FROM staff_contacts_personal scp
+            LEFT JOIN (select * from staff_join_leave_record WHERE staff_state = 1) sjlr ON scp.contact_id=sjlr.id
+        where 1=1
+        <if test="staffContactsPersonalDTO.staffName != null and staffContactsPersonalDTO.staffName != ''">
+            and sjlr.staff_name like concat('%',#{staffContactsPersonalDTO.staffName},'%')
+        </if>
+
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/customervisits/CustomerVisitsMapper.xml b/src/main/resources/mapper/customervisits/CustomerVisitsMapper.xml
new file mode 100644
index 0000000..92d44bd
--- /dev/null
+++ b/src/main/resources/mapper/customervisits/CustomerVisitsMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.customervisits.mapper.CustomerVisitsMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/device/DeviceDefectRecordMapper.xml b/src/main/resources/mapper/device/DeviceDefectRecordMapper.xml
new file mode 100644
index 0000000..bcd4bd5
--- /dev/null
+++ b/src/main/resources/mapper/device/DeviceDefectRecordMapper.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.ruoyi.device.mapper.DeviceDefectRecordMapper">
+
+    <select id="listPage" resultType="com.ruoyi.device.dto.DeviceDefectRecordDto">
+        select ddr.*,dl.device_name,dl.device_model
+        from device_defect_record ddr
+        left join device_ledger dl on ddr.device_ledger_id = dl.id
+        <where>
+            1=1
+            <if test="deviceDefectRecordDto.deviceLedgerId != null">
+                and ddr.device_ledger_id = #{deviceDefectRecordDto.deviceLedgerId}
+            </if>
+            <if test="deviceDefectRecordDto.deviceName != null and deviceDefectRecordDto.deviceName != ''">
+                and dl.device_name like concat('%',#{deviceDefectRecordDto.deviceName},'%')
+            </if>
+            <if test="deviceDefectRecordDto.status != null">
+                and ddr.status = #{deviceDefectRecordDto.status}
+            </if>
+        </where>
+
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/device/DeviceLedgerMapper.xml b/src/main/resources/mapper/device/DeviceLedgerMapper.xml
index 4a8f435..9cee459 100644
--- a/src/main/resources/mapper/device/DeviceLedgerMapper.xml
+++ b/src/main/resources/mapper/device/DeviceLedgerMapper.xml
@@ -13,6 +13,11 @@
         dl.supplier_name,
         dl.unit,
         dl.number,
+        dl.status,
+        dl.plan_runtime_time,
+        dl.start_runtime_time,
+        dl.end_runtime_time,
+        dl.runtime_duration,
         dl.tax_including_price_unit,
         dl.tax_including_price_total,
         dl.tax_rate,
@@ -23,7 +28,7 @@
         dl.update_user,
         dl.tenant_id
         FROM device_ledger dl
-        left join  sys_user  su on dl.create_user = su.user_id
+        left join sys_user su on dl.create_user = su.user_id
         <where>
             <!-- 璁惧鍚嶇О -->
             <if test="deviceLedger.deviceName != null and deviceLedger.deviceName != ''">
@@ -59,7 +64,7 @@
                 AND dl.create_time &gt;= DATE_FORMAT(#{deviceLedger.entryDateStart},'%Y-%m-%d')
             </if>
             <if test="deviceLedger.entryDateEnd != null and deviceLedger.entryDateEnd != '' ">
-                AND  dl.create_time &lt;= DATE_FORMAT(#{deviceLedger.entryDateEnd},'%Y-%m-%d')
+                AND dl.create_time &lt;= DATE_FORMAT(#{deviceLedger.entryDateEnd},'%Y-%m-%d')
             </if>
 
             <!-- 绉熸埛ID -->
@@ -72,5 +77,10 @@
     <select id="deviceLedgerExportList" resultType="com.ruoyi.device.execl.DeviceLedgerExeclDto">
 
     </select>
+    <select id="selectById1" resultType="com.ruoyi.device.pojo.DeviceLedger">
+        select *
+        from device_ledger
+        where id = #{id}
+    </select>
 
 </mapper>
diff --git a/src/main/resources/mapper/device/DeviceMaintenanceMapper.xml b/src/main/resources/mapper/device/DeviceMaintenanceMapper.xml
index 468198e..9917ce2 100644
--- a/src/main/resources/mapper/device/DeviceMaintenanceMapper.xml
+++ b/src/main/resources/mapper/device/DeviceMaintenanceMapper.xml
@@ -7,19 +7,19 @@
 
     <select id="queryPage" resultType="com.ruoyi.device.dto.DeviceMaintenanceDto">
         select dm.id,
-               dm.device_ledger_id,
-               dm.maintenance_plan_time,
-                dm.maintenance_actually_time,
-                dm.maintenance_result,
-                dm.status,
-                dm.create_time,
-                dm.update_time,
-                dm.create_user,
-                dm.update_user,
-                dm.tenant_id,
-                dm.maintenance_actually_name,
-               dl.device_name,
-               dl.device_model,
+        dm.device_ledger_id,
+        dm.maintenance_plan_time,
+        dm.maintenance_actually_time,
+        dm.maintenance_result,
+        dm.status,
+        dm.create_time,
+        dm.update_time,
+        dm.create_user,
+        dm.update_user,
+        dm.tenant_id,
+        dm.maintenance_actually_name,
+        dl.device_name,
+        dl.device_model,
         su.user_name as create_user_name
         from device_maintenance dm
         left join device_ledger dl on dm.device_ledger_id = dl.id
@@ -60,9 +60,14 @@
                dl.device_model,
                su.user_name as create_user_name
         from device_maintenance dm
-        left join device_ledger dl on dm.device_ledger_id = dl.id
-        left join sys_user su on dm.create_user = su.user_id
+                 left join device_ledger dl on dm.device_ledger_id = dl.id
+                 left join sys_user su on dm.create_user = su.user_id
         where dm.id = #{id}
     </select>
+    <select id="list1" resultType="com.ruoyi.device.pojo.DeviceMaintenance">
+        select *
+        from device_maintenance
+        where device_ledger_id = #{id}
+    </select>
 
 </mapper>
diff --git a/src/main/resources/mapper/equipmentenergyconsumption/EnergyPeriodMapper.xml b/src/main/resources/mapper/equipmentenergyconsumption/EnergyPeriodMapper.xml
new file mode 100644
index 0000000..c026425
--- /dev/null
+++ b/src/main/resources/mapper/equipmentenergyconsumption/EnergyPeriodMapper.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.equipmentenergyconsumption.mapper.EnergyPeriodMapper">
+
+
+    <select id="listPage" resultType="com.ruoyi.equipmentenergyconsumption.pojo.EnergyPeriod">
+        select * from energy_period
+        <where>
+            <if test="energyPeriod.date != null">
+                date = #{energyPeriod.date}
+            </if>
+            <if test="energyPeriod.price != null">
+                and price = #{energyPeriod.price}
+            </if>
+            <if test="energyPeriod.peak != null">
+                and peak = #{energyPeriod.peak}
+            </if>
+            <if test="energyPeriod.valley != null">
+                and valley = #{energyPeriod.valley}
+            </if>
+            <if test="energyPeriod.flat != null">
+                and flat = #{energyPeriod.flat}
+            </if>
+            <if test="energyPeriod.sharp != null">
+                and sharp = #{energyPeriod.sharp}
+            </if>
+        </where>
+    </select>
+</mapper>
diff --git a/src/main/resources/mapper/equipmentenergyconsumption/electricityConsumptionAreaMapper.xml b/src/main/resources/mapper/equipmentenergyconsumption/electricityConsumptionAreaMapper.xml
new file mode 100644
index 0000000..aed220c
--- /dev/null
+++ b/src/main/resources/mapper/equipmentenergyconsumption/electricityConsumptionAreaMapper.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.equipmentenergyconsumption.mapper.ElectricityConsumptionAreaMapper">
+
+    <select id="listPage" resultType="com.ruoyi.equipmentenergyconsumption.pojo.ElectricityConsumptionArea">
+        select * from electricity_consumption_area
+        <where>
+            <if test="electricityConsumptionArea.id != null">
+                id = #{electricityConsumptionArea.id}
+            </if>
+            <if test="electricityConsumptionArea.areaName != null and electricityConsumptionArea.areaName != ''">
+                and area_name like CONCAT('%', #{electricityConsumptionArea.areaName}, '%')
+            </if>
+            <if test="electricityConsumptionArea.areaType != null and electricityConsumptionArea.areaType != ''">
+                and area_type like CONCAT('%', #{electricityConsumptionArea.areaType}, '%')
+            </if>
+            <if test="electricityConsumptionArea.sort != null">
+                and sort = #{electricityConsumptionArea.sort}
+            </if>
+            <if test="electricityConsumptionArea.fuId != null">
+                and fu_id = #{electricityConsumptionArea.fuId}
+            </if>
+        </where>
+    </select>
+
+</mapper>
diff --git a/src/main/resources/mapper/inspectiontask/TimingTaskMapper.xml b/src/main/resources/mapper/inspectiontask/TimingTaskMapper.xml
new file mode 100644
index 0000000..bb74e0e
--- /dev/null
+++ b/src/main/resources/mapper/inspectiontask/TimingTaskMapper.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.inspectiontask.mapper.TimingTaskMapper">
+
+    <select id="getTaskById" resultType="com.ruoyi.inspectiontask.pojo.TimingTask" useCache="false">
+        SELECT * FROM timing_task WHERE id = #{id}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/lavorissue/LavorIssueMapper.xml b/src/main/resources/mapper/lavorissue/LavorIssueMapper.xml
new file mode 100644
index 0000000..81cf11d
--- /dev/null
+++ b/src/main/resources/mapper/lavorissue/LavorIssueMapper.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.lavorissue.mapper.LavorIssueMapper">
+
+    <select id="listPage" resultType="com.ruoyi.lavorissue.pojo.LaborIssue">
+        select
+        t1.*,
+               t2.staff_name as staffName,
+               t2.staff_no as staffNo,
+               t3.dict_label as dictName,
+               t4.dict_label as dictTypeName
+        from labor_issue t1
+        left join staff_join_leave_record t2 on t1.staff_id = t2.id
+        left join sys_dict_data t3 on t1.dict_id = t3.dict_value
+        left join sys_dict_data t4 on t1.dict_type = t4.dict_value
+        <where>
+            <if test="req.season != null and req.season != ''">
+                and (t1.issue_date &gt;= #{req.startDate} and t1.issue_date &lt;= #{req.endDate})
+            </if>
+            <if test="req.issueDate != null">
+                and (t1.issue_date &gt;= #{req.startDate} and t1.issue_date &lt;= #{req.endDate})
+            </if>
+            <if test="req.staffName != null and req.staffName != ''">
+                and t2.staff_name like concat('%',#{req.staffName},'%')
+            </if>
+            <if test="req.status != null and req.status == 1">
+                and t1.adopted_date is not null
+            </if>
+            <if test="req.status != null and req.status == 2">
+                and t1.adopted_date is null
+            </if>
+            <if test="req.status != null and req.status == 3">
+                and t1.adopted_date is not null and t1.issue_date &lt; t1.adopted_date
+            </if>
+            <if test="req.status != null and req.status == 4">
+                and t1.adopted_date is null and t1.issue_date &lt; current_date()
+            </if>
+        </where>
+    </select>
+    <select id="list" resultType="com.ruoyi.lavorissue.pojo.LaborIssue">
+        select
+            t1.*,
+            t2.staff_name as staffName,
+            t2.staff_no as staffNo,
+            t3.dict_label as dictName,
+            t4.dict_label as dictTypeName
+        from labor_issue t1
+                 left join staff_join_leave_record t2 on t1.staff_id = t2.id
+                 left join sys_dict_data t3 on t1.dict_id = t3.dict_value
+                 left join sys_dict_data t4 on t1.dict_type = t4.dict_value
+        <where>
+            <if test="req.adoptedDate != null">
+                and t1.adopted_date is null
+            </if>
+            <if test="req.issueDate != null">
+                and (t1.issue_date &gt;= #{req.startDate} and t1.issue_date &lt;= #{req.endDate})
+            </if>
+            <if test="req.staffId != null">
+                and t1.staff_id = #{req.staffId}
+            </if>
+            <if test="req.season != null and req.season != ''">
+                and (t1.issue_date &gt;= #{req.startDate} and t1.issue_date &lt;= #{req.endDate})
+            </if>
+            <if test="req.status != null and req.status == 1">
+                and t1.adopted_date is not null
+            </if>
+            <if test="req.status != null and req.status == 2">
+                and t1.adopted_date is null
+            </if>
+            <if test="req.status != null and req.status == 3">
+                and t1.adopted_date is not null and t1.issue_date &lt; t1.adopted_date
+            </if>
+            <if test="req.status != null and req.status == 4">
+                and t1.adopted_date is null and t1.issue_date &lt; current_date()
+            </if>
+        </where>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml b/src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml
new file mode 100644
index 0000000..2968e9a
--- /dev/null
+++ b/src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.measuringinstrumentledger.mapper.SparePartsMapper">
+    <select id="listPage" resultType="com.ruoyi.measuringinstrumentledger.dto.SparePartsDto">
+        select sp.*,sp1.name as parentName from spare_parts sp
+        left join spare_parts sp1 on sp1.id = sp.parent_id
+        <where>
+            <if test="spareParts.name != null">
+                and name like concat('%',#{spareParts.name},'%')
+            </if>
+        </where>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/oA/OaProjectMapper.xml b/src/main/resources/mapper/oA/OaProjectMapper.xml
new file mode 100644
index 0000000..c245a39
--- /dev/null
+++ b/src/main/resources/mapper/oA/OaProjectMapper.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.oA.mapper.OaProjectMapper">
+
+
+    <select id="listPage" resultType="com.ruoyi.oA.dto.OaProjectDto">
+        select op.*,su.nick_name as managerName from oa_project op
+        LEFT JOIN sys_user su ON op.manager_id=su.user_id
+        <where>
+        1=1
+            <if test="req.projectName != null and req.projectName != ''">
+                and op.project_name like concat('%',#{req.projectName},'%')
+            </if>
+            <if test="req.managerName != null and req.managerName != ''">
+                and su.nick_name like concat('%',#{req.managerName},'%')
+            </if>
+            <if test="req.status != null and req.status != ''">
+                and op.status = #{req.status}
+            </if>
+        </where>
+    </select>
+    <select id="selectByIds" resultType="com.ruoyi.oA.dto.OaProjectDto">
+        select op.*,su.nick_name as managerName from oa_project op
+        LEFT JOIN sys_user su ON op.manager_id=su.user_id
+        where op.project_id in
+        <foreach collection="ids" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </select>
+</mapper>
diff --git a/src/main/resources/mapper/oA/OaProjectPhaseMapper.xml b/src/main/resources/mapper/oA/OaProjectPhaseMapper.xml
new file mode 100644
index 0000000..2f52fe9
--- /dev/null
+++ b/src/main/resources/mapper/oA/OaProjectPhaseMapper.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.oA.mapper.OaProjectPhaseMapper">
+
+    <resultMap id="BaseResultMap" type="com.ruoyi.oA.pojo.OaProjectPhase">
+            <id property="phaseId" column="phase_id" jdbcType="INTEGER"/>
+            <result property="phaseName" column="phase_name" jdbcType="VARCHAR"/>
+            <result property="oaProjectId" column="oa_project_id" jdbcType="INTEGER"/>
+            <result property="startDate" column="start_date" jdbcType="TIMESTAMP"/>
+            <result property="endDate" column="end_date" jdbcType="TIMESTAMP"/>
+            <result property="status" column="status" jdbcType="VARCHAR"/>
+            <result property="createUser" column="create_user" jdbcType="BIGINT"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateUser" column="update_user" jdbcType="BIGINT"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="tenantId" column="tenant_id" jdbcType="BIGINT"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        phase_id,phase_name,oa_project_id,
+        start_date,end_date,status,
+        create_user,create_time,update_user,
+        update_time,tenant_id
+    </sql>
+</mapper>
diff --git a/src/main/resources/mapper/oA/OaProjectPhaseTaskMapper.xml b/src/main/resources/mapper/oA/OaProjectPhaseTaskMapper.xml
new file mode 100644
index 0000000..cc029d9
--- /dev/null
+++ b/src/main/resources/mapper/oA/OaProjectPhaseTaskMapper.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.oA.mapper.OaProjectPhaseTaskMapper">
+
+    <resultMap id="BaseResultMap" type="com.ruoyi.oA.pojo.OaProjectPhaseTask">
+            <id property="taskId" column="task_id" jdbcType="INTEGER"/>
+            <result property="taskName" column="task_name" jdbcType="VARCHAR"/>
+            <result property="phaseId" column="phase_id" jdbcType="INTEGER"/>
+            <result property="startDate" column="start_date" jdbcType="TIMESTAMP"/>
+            <result property="endDate" column="end_date" jdbcType="TIMESTAMP"/>
+            <result property="targetDate" column="target_date" jdbcType="TIMESTAMP"/>
+            <result property="targetValue" column="target_value" jdbcType="INTEGER"/>
+            <result property="currentValue" column="current_value" jdbcType="INTEGER"/>
+            <result property="unit" column="unit" jdbcType="VARCHAR"/>
+            <result property="status" column="status" jdbcType="VARCHAR"/>
+            <result property="completionRate" column="completion_rate" jdbcType="INTEGER"/>
+            <result property="createUser" column="create_user" jdbcType="BIGINT"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateUser" column="update_user" jdbcType="BIGINT"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="tenantId" column="tenant_id" jdbcType="BIGINT"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        task_id,task_name,phase_id,
+        start_date,end_date,target_date,
+        target_value,current_value,unit,
+        status,completion_rate,create_user,
+        create_time,update_user,update_time,
+        tenant_id
+    </sql>
+</mapper>
diff --git a/src/main/resources/mapper/officesupplies/OfficeSuppliesMapper.xml b/src/main/resources/mapper/officesupplies/OfficeSuppliesMapper.xml
new file mode 100644
index 0000000..7191aa9
--- /dev/null
+++ b/src/main/resources/mapper/officesupplies/OfficeSuppliesMapper.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.officesupplies.mapper.OfficeSuppliesMapper">
+
+    <select id="listPage" resultType="com.ruoyi.officesupplies.pojo.OfficeSupplies">
+        select * from office_supplies
+        <where>
+            <if test="req.code != null and req.code != ''">
+                and code like concat('%',#{req.code},'%')
+            </if>
+            <if test="req.applicant != null and req.applicant != ''">
+                and applicant like concat('%',#{req.applicant},'%')
+            </if>
+            <if test="req.status != null and req.status != ''">
+                and status = #{req.status}
+            </if>
+        </where>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/procurementrecord/GasTankWarningMapper.xml b/src/main/resources/mapper/procurementrecord/GasTankWarningMapper.xml
new file mode 100644
index 0000000..9f06e2c
--- /dev/null
+++ b/src/main/resources/mapper/procurementrecord/GasTankWarningMapper.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.procurementrecord.mapper.GasTankWarningMapper">
+
+
+    <select id="listPage" resultType="com.ruoyi.procurementrecord.pojo.GasTankWarning">
+        select * from gas_tank_warning
+        where 1=1
+        <if test="gasTankWarning.tankName != null and gasTankWarning.tankName != ''">
+            and tank_name like concat('%', #{gasTankWarning.tankName}, '%')
+        </if>
+        <if test="gasTankWarning.tankType != null">
+            and tank_type = #{gasTankWarning.tankType}
+        </if>
+        <if test="gasTankWarning.warningType != null">
+            and warning_type = #{gasTankWarning.warningType}
+        </if>
+        <if test="gasTankWarning.warningLevel != null">
+            and warning_level = #{gasTankWarning.warningLevel}
+        </if>
+
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/procurementrecord/InboundManagementMapper.xml b/src/main/resources/mapper/procurementrecord/InboundManagementMapper.xml
new file mode 100644
index 0000000..fbaa3e3
--- /dev/null
+++ b/src/main/resources/mapper/procurementrecord/InboundManagementMapper.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.procurementrecord.mapper.InboundManagementMapper">
+
+    <select id="listPage" resultType="com.ruoyi.procurementrecord.pojo.InboundManagement">
+        select * from inbound_management
+        <where>
+            <if test="req.orderNo != null and req.orderNo != ''">
+                and order_no like concat('%',#{req.orderNo},'%')
+            </if>
+            <if test="req.supplierName != null and req.supplierName != ''">
+                and supplier_name like concat('%',#{req.supplierName},'%')
+            </if>
+        </where>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/procurementrecord/ProcurementPlanMapper.xml b/src/main/resources/mapper/procurementrecord/ProcurementPlanMapper.xml
new file mode 100644
index 0000000..2403bf2
--- /dev/null
+++ b/src/main/resources/mapper/procurementrecord/ProcurementPlanMapper.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.procurementrecord.mapper.ProcurementPlanMapper">
+
+    <select id="listPage" resultType="com.ruoyi.procurementrecord.pojo.ProcurementPlan">
+        SELECT * FROM procurement_plan
+        <where>
+            <if test="req.status != null and req.status != ''">
+                AND status = #{req.status}
+            </if>
+            <if test="req.planName != null and req.planName != ''">
+                AND plan_name LIKE CONCAT('%',#{req.planName},'%')
+            </if>
+        </where>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/procurementrecord/ProcurementPriceManagementMapper.xml b/src/main/resources/mapper/procurementrecord/ProcurementPriceManagementMapper.xml
new file mode 100644
index 0000000..196adfa
--- /dev/null
+++ b/src/main/resources/mapper/procurementrecord/ProcurementPriceManagementMapper.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.procurementrecord.mapper.ProcurementPriceManagementMapper">
+
+    <select id="listPage" resultType="com.ruoyi.procurementrecord.pojo.ProcurementPriceManagement">
+        SELECT * FROM procurement_price_management
+        <where>
+            <if test="req.productName != null and req.productName != ''">
+                AND product_name like concat('%',#{req.productName},'%')
+            </if>
+            <if test="req.supplierName != null and req.supplierName != ''">
+                AND supplier_name = #{req.supplierName}
+            </if>
+        </where>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
index 7d0f59b..c378c6a 100644
--- a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
+++ b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
@@ -11,6 +11,8 @@
             t2.specification_model,
             t2.unit,
             t2.quantity,
+            t2.min_stock,
+            t2.warn_num,
             t2.quantity as quantity0,
             t2.tax_rate,
             t2.tax_inclusive_unit_price,
@@ -38,14 +40,15 @@
         t2.unit,
         t2.tax_rate,
         t2.tax_inclusive_unit_price,
-        t2.tax_inclusive_total_price,
-        t2.tax_exclusive_total_price,
+        (t1.inbound_num * t2.tax_inclusive_unit_price) as taxInclusiveTotalPrice,
+        (t1.inbound_num * t2.tax_inclusive_unit_price - t1.inbound_num * t2.tax_inclusive_unit_price * t2.tax_rate / 100) as taxExclusiveTotalPrice,
         t1.inbound_batches,
         t1.inbound_num,
         t1.inbound_num as inboundNum0,
         t1.create_time,
         t1.update_time,
-        t1.create_by
+        t1.create_by,
+        t2.warn_num
         from  procurement_record_storage t1
                   left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
                   left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
@@ -53,6 +56,9 @@
             1 = 1
             <if test="req.supplierName != null and req.supplierName != ''">
                 and t3.supplier_name like  concat('%',#{req.supplierName},'%')
+            </if>
+            <if test="req.timeStr != null and req.timeStr != ''">
+                and t1.create_time like  concat('%',#{req.timeStr},'%')
             </if>
         </where>
     </select>
@@ -89,16 +95,19 @@
         t1.create_user,
         t2.specification_model,
         t2.unit,
+        t2.min_stock,
         t2.tax_rate,
         t2.tax_inclusive_unit_price,
         t2.tax_inclusive_total_price,
         t2.tax_exclusive_total_price,
         t1.inbound_batches,
-        t1.inbound_num,
-        t1.inbound_num as inboundNum0,
+        sum(t1.inbound_num) as inboundNum,
+        sum(t1.inbound_num) as inboundNum0,
+        t1.inbound_num as totalInboundNum,
         t1.create_time,
         t1.update_time,
-        t1.create_by
+        t1.create_by,
+        t2.warn_num
         from  procurement_record_storage t1
         left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
         left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
@@ -107,7 +116,26 @@
             <if test="req.supplierName != null and req.supplierName != ''">
                 and t3.supplier_name like  concat('%',#{req.supplierName},'%')
             </if>
+            <if test="req.timeStr != null and req.timeStr != ''">
+                and t1.create_time like  concat('%',#{req.timeStr},'%')
+            </if>
+            <if test="req.reportDate != null">
+                and t1.create_time >= #{req.reportDate} and t1.create_time &lt; DATE_ADD(#{req.reportDate}, INTERVAL 1 DAY)
+            </if>
+            <if test="req.startMonth != null">
+                and t1.create_time >= #{req.startMonth}
+            </if>
+            <if test="req.endMonth != null">
+                and t1.create_time &lt;= #{req.endMonth}
+            </if>
+            <if test="req.startDate != null">
+                and t1.create_time >= #{req.startDate}
+            </if>
+            <if test="req.endDate != null">
+                and t1.create_time &lt;= #{req.endDate}
+            </if>
         </where>
+        group by t3.supplier_name,t2.product_category,t2.specification_model
     </select>
     <select id="listCopy" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy">
         select
diff --git a/src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml b/src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml
index a127b10..ec91c53 100644
--- a/src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml
+++ b/src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml
@@ -7,6 +7,7 @@
         t3.supplier_name,
         t2.product_category,
         t1.id,
+        t1.code,
         t2.specification_model,
         t2.unit,
         t2.tax_rate,
@@ -15,7 +16,8 @@
         t2.tax_exclusive_total_price,
         t1.inbound_num,
         t1.create_time,
-        t1.create_by
+        t1.create_by,
+        t2.warn_num
         from  procurement_record_out t1
         left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
         left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
@@ -24,6 +26,9 @@
             <if test="req.supplierName != null and req.supplierName != ''">
                 and t3.supplier_name like  concat('%',#{req.supplierName},'%')
             </if>
+            <if test="req.timeStr != null and req.timeStr != ''">
+                and t1.create_time like  concat('%',#{req.timeStr},'%')
+            </if>
         </where>
     </select>
     <select id="list" resultType="com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto">
diff --git a/src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml b/src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml
new file mode 100644
index 0000000..ce8eb39
--- /dev/null
+++ b/src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.procurementrecord.mapper.ReturnManagementMapper">
+
+    <select id="listPage" resultType="com.ruoyi.procurementrecord.pojo.ReturnManagement">
+        select * from return_management
+        <where>
+            <if test="req.returnNo != null and req.returnNo != ''">
+                and return_no like concat('%',#{req.returnNo},'%')
+            </if>
+            <if test="req.returnType != null and req.returnType != ''">
+                and return_type = #{req.returnType}
+            </if>
+        </where>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml b/src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml
index f30adaa..29b88f2 100644
--- a/src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml
+++ b/src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml
@@ -26,7 +26,7 @@
         <where>
             t3.type = 1
             <if test="salesLedgerDto.schedulingUserName != null and salesLedgerDto.schedulingUserName != '' ">
-                AND  t4.scheduling_user_uame LIKE CONCAT('%',#{salesLedgerDto.schedulingUserName},'%')
+                AND  t4.scheduling_user_name LIKE CONCAT('%',#{salesLedgerDto.schedulingUserName},'%')
             </if>
             <if test="salesLedgerDto.customerName != null and salesLedgerDto.customerName != '' ">
                 AND  T1.customer_name LIKE CONCAT('%',#{salesLedgerDto.customerName},'%')
@@ -50,4 +50,4 @@
         group by t4.id
         order by t4.update_time desc
     </select>
-</mapper>
\ No newline at end of file
+</mapper>
diff --git a/src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml b/src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml
index d245389..8e8cf1c 100644
--- a/src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml
+++ b/src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml
@@ -151,18 +151,24 @@
 
     <select id="paymentHistoryListPage" resultType="com.ruoyi.purchase.dto.PaymentRegistrationDto">
         SELECT
+        T1.id,
         T1.payment_date,
         T2.supplier_name,
         T1.current_payment_amount,
         T1.payment_method,
         T3.nick_name AS registrant,
-        T1.registrationt_date
+        T1.registrationt_date,
+        t4.purchase_contract_number,
+        t5.invoice_amount,
+        t5.invoice_number
         FROM
         payment_registration T1
+        LEFT JOIN purchase_ledger t4 ON t4.id = T1.purchase_ledger_id
         LEFT JOIN
         supplier_manage T2 ON T1.supplier_id = T2.id
         LEFT JOIN
         sys_user T3 ON T3.user_id = T1.registrant_id
+        left join ticket_registration t5 on t5.purchase_ledger_id = T1.purchase_ledger_id
         <where>
             <if test="params.searchText != null and params.searchText != '' ">
                 AND T2.supplier_name LIKE CONCAT('%',#{params.searchText},'%')
@@ -173,6 +179,9 @@
             <if test="params.paymentDateEnd != null and params.paymentDateEnd !='' ">
                 AND T1.payment_date &lt;= date_format(#{params.paymentDateEnd},'%Y-%m-%d')
             </if>
+            <if test="params.purchaseContractNumber != null and params.purchaseContractNumber !='' ">
+                AND t4.purchase_contract_number LIKE CONCAT('%',#{params.purchaseContractNumber},'%')
+            </if>
         </where>
         ORDER BY T1.payment_date,T1.create_time DESC
     </select>
diff --git a/src/main/resources/mapper/purchase/ProductRecordMapper.xml b/src/main/resources/mapper/purchase/ProductRecordMapper.xml
index 6db5f75..5c338d7 100644
--- a/src/main/resources/mapper/purchase/ProductRecordMapper.xml
+++ b/src/main/resources/mapper/purchase/ProductRecordMapper.xml
@@ -13,6 +13,7 @@
         pm.model AS product_model,
         pl.purchase_contract_number,
         pl.supplier_name,
+        pl.project_name,
         pr.*,
         tr.invoice_number,
         tr.iss_uer_id,
diff --git a/src/main/resources/mapper/sales/InvoiceLedgerMapper.xml b/src/main/resources/mapper/sales/InvoiceLedgerMapper.xml
index b8f9aa2..0c93e4d 100644
--- a/src/main/resources/mapper/sales/InvoiceLedgerMapper.xml
+++ b/src/main/resources/mapper/sales/InvoiceLedgerMapper.xml
@@ -114,7 +114,7 @@
             T4.id,T4.customer_name ,
             SUM(invoice_total) AS invoice_total,
             IFNULL( SUM(T5.receipt_payment_amount) , 0 ) AS receipt_payment_amount,
-            IFNULL((SUM(invoice_total)  - SUM(T5.receipt_payment_amount)),0) AS unReceipt_payment_amount
+            IFNULL((IFNULL(SUM(invoice_total),0)  - IFNULL(SUM(T5.receipt_payment_amount),0)),0) AS unReceipt_payment_amount
         FROM
             invoice_ledger T1
                 LEFT JOIN invoice_registration_product T2 ON T1.invoice_registration_product_id = T2.id
diff --git a/src/main/resources/mapper/sales/PaymentShippingMapper.xml b/src/main/resources/mapper/sales/PaymentShippingMapper.xml
new file mode 100644
index 0000000..749c8ba
--- /dev/null
+++ b/src/main/resources/mapper/sales/PaymentShippingMapper.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.sales.mapper.PaymentShippingMapper">
+
+    <select id="listPage" resultType="com.ruoyi.sales.pojo.PaymentShipping">
+        select * from payment_shipping
+        <where>
+            <if test="req.orderNo != null and req.orderNo != ''">
+                and order_no like concat('%',#{req.orderNo},'%')
+            </if>
+            <if test="req.paymentStatus != null and req.paymentStatus != ''">
+                and payment_status = #{req.paymentStatus}
+            </if>
+            <if test="req.shippingStatus != null and req.shippingStatus != ''">
+                and shipping_status = #{req.shippingStatus}
+            </if>
+        </where>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/sales/ReceiptPaymentMapper.xml b/src/main/resources/mapper/sales/ReceiptPaymentMapper.xml
index df06df6..a52038b 100644
--- a/src/main/resources/mapper/sales/ReceiptPaymentMapper.xml
+++ b/src/main/resources/mapper/sales/ReceiptPaymentMapper.xml
@@ -95,17 +95,23 @@
         BY invoice_ledger_id
         ) T6 ON T1.id = T6.invoice_ledger_id
         <where>
-            <if test="c.customerName != null and c.customerName !=''">
-                AND T3.customer_name LIKE CONCAT('%',#{c.customerName},'%')
+            <if test="req.customerName != null and req.customerName !=''">
+                AND T3.customer_name LIKE CONCAT('%',#{req.customerName},'%')
             </if>
-            <if test="c.invoiceLedgerId != null">
-                AND T1.id = #{c.invoiceLedgerId}
+            <if test="req.invoiceLedgerId != null">
+                AND T1.id = #{req.invoiceLedgerId}
             </if>
-            <if test="c.customerContractNo != null and c.customerContractNo !=''">
-                AND T3.customer_contract_no LIKE CONCAT('%',#{c.customerContractNo},'%')
+            <if test="req.customerContractNo != null and req.customerContractNo !=''">
+                AND T3.customer_contract_no LIKE CONCAT('%',#{req.customerContractNo},'%')
             </if>
-            <if test="c.projectName != null and c.projectName !=''">
-                AND T3.project_name LIKE CONCAT('%',#{c.projectName},'%')
+            <if test="req.projectName != null and req.projectName !=''">
+                AND T3.project_name LIKE CONCAT('%',#{req.projectName},'%')
+            </if>
+            <if test="req.invoiceDateStart != null and req.invoiceDateStart != '' ">
+                AND T1.invoice_date &gt;= DATE_FORMAT(#{req.invoiceDateStart},'%Y-%m-%d')
+            </if>
+            <if test="req.invoiceDateEnd != null and req.invoiceDateEnd != '' ">
+                AND  T1.invoice_date &lt;= DATE_FORMAT(#{req.invoiceDateEnd},'%Y-%m-%d')
             </if>
         </where>
         ORDER BY T2.create_time DESC
@@ -183,6 +189,7 @@
 
     <select id="receiptPaymentHistoryListPage" resultType="com.ruoyi.sales.dto.ReceiptPaymentDto">
         SELECT
+        T1.id,
         T1.receipt_payment_date,
         T5.customer_name,
         T1.receipt_payment_amount,
diff --git a/src/main/resources/mapper/sales/SalesQuotationMapper.xml b/src/main/resources/mapper/sales/SalesQuotationMapper.xml
new file mode 100644
index 0000000..a39cd45
--- /dev/null
+++ b/src/main/resources/mapper/sales/SalesQuotationMapper.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.sales.mapper.SalesQuotationMapper">
+    <select id="listPage" resultType="com.ruoyi.sales.dto.SalesQuotationDto">
+        SELECT * FROM sales_quotation
+        WHERE 1=1
+        <if test="salesQuotationDto.quotationNo != null and salesQuotationDto.quotationNo != '' ">
+            AND quotation_no LIKE CONCAT('%',#{salesQuotationDto.quotationNo},'%')
+        </if>
+        <if test="salesQuotationDto.customer != null and salesQuotationDto.customer != '' ">
+            AND customer = #{salesQuotationDto.customer}
+        </if>
+        <if test="salesQuotationDto.status != null and salesQuotationDto.status != '' ">
+            AND status = #{salesQuotationDto.status}
+        </if>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/sales/SalesQuotationProductMapper.xml b/src/main/resources/mapper/sales/SalesQuotationProductMapper.xml
new file mode 100644
index 0000000..fa3745e
--- /dev/null
+++ b/src/main/resources/mapper/sales/SalesQuotationProductMapper.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.sales.mapper.SalesQuotationProductMapper">
+<!--    <select id="selectBySalesQuotationIds" resultType="com.ruoyi.sales.pojo.SalesQuotationProduct">-->
+<!--        select * from sales_quotation_product where sales_quotation_id in-->
+<!--        <foreach collection="salesQuotationIds" item="salesQuotationId" open="(" close=")" separator=",">-->
+<!--            #{salesQuotationId}-->
+<!--        </foreach>-->
+<!--    </select>-->
+    <select id="selectBySalesQuotationId" resultType="com.ruoyi.sales.pojo.SalesQuotationProduct">
+        select * from sales_quotation_product where sales_quotation_id = #{id}
+    </select>
+</mapper>
diff --git a/src/main/resources/mapper/sales/SalespersonManagementMapper.xml b/src/main/resources/mapper/sales/SalespersonManagementMapper.xml
new file mode 100644
index 0000000..3a2049d
--- /dev/null
+++ b/src/main/resources/mapper/sales/SalespersonManagementMapper.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.sales.mapper.SalespersonManagementMapper">
+
+    <select id="listPage" resultType="com.ruoyi.sales.pojo.SalespersonManagement">
+        select * from salesperson_management
+        <where>
+            <if test="req.name != null and req.name != ''">
+                and `name` like concat('%',#{req.name},'%')
+            </if>
+            <if test="req.department != null and req.department != ''">
+                and department = #{req.department}
+            </if>
+            <if test="req.status != null and req.status != ''">
+                and status = #{req.status}
+            </if>
+        </where>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/sales/ShippingInfoMapper.xml b/src/main/resources/mapper/sales/ShippingInfoMapper.xml
new file mode 100644
index 0000000..efe93cf
--- /dev/null
+++ b/src/main/resources/mapper/sales/ShippingInfoMapper.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.sales.mapper.ShippingInfoMapper">
+
+    <select id="listPage" resultType="com.ruoyi.sales.pojo.ShippingInfo">
+        SELECT
+        s.id,
+        s.sales_ledger_id,
+        s.shipping_date,
+        s.shipping_car_number,
+        s.create_time,
+        s.update_time,
+        s.create_user,
+        s.update_user,
+        s.tenant_id,
+        sl.sales_contract_no,
+        sl.customer_name
+        FROM shipping_info s
+        LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id
+        WHERE 1=1
+        <if test="req.salesContractNo != null and req.salesContractNo != ''">
+            AND sl.sales_contract_no LIKE CONCAT('%',#{req.salesContractNo},'%')
+        </if>
+        <if test="req.shippingCarNumber != null and req.shippingCarNumber != ''">
+            AND s.shipping_car_number LIKE CONCAT('%',#{req.shippingCarNumber},'%')
+        </if>
+    </select>
+    <select id="listAll" resultType="com.ruoyi.sales.pojo.ShippingInfo">
+        SELECT
+            s.id,
+            s.sales_ledger_id,
+            s.shipping_date,
+            s.shipping_car_number,
+            s.create_time,
+            s.update_time,
+            s.create_user,
+            s.update_user,
+            s.tenant_id,
+            sl.sales_contract_no,
+            sl.customer_name
+        FROM shipping_info s
+                 LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/staff/HolidayApplicationMapper.xml b/src/main/resources/mapper/staff/HolidayApplicationMapper.xml
new file mode 100644
index 0000000..b0bda29
--- /dev/null
+++ b/src/main/resources/mapper/staff/HolidayApplicationMapper.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.ruoyi.staff.mapper.HolidayApplicationMapper">
+
+
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/staff/PersonalAttendanceRecordsMapper.xml b/src/main/resources/mapper/staff/PersonalAttendanceRecordsMapper.xml
new file mode 100644
index 0000000..13d3513
--- /dev/null
+++ b/src/main/resources/mapper/staff/PersonalAttendanceRecordsMapper.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.ruoyi.staff.mapper.PersonalAttendanceRecordsMapper">
+
+
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/staff/StaffJoinLeaveRecordMapper.xml b/src/main/resources/mapper/staff/StaffJoinLeaveRecordMapper.xml
index 7b11511..d720d37 100644
--- a/src/main/resources/mapper/staff/StaffJoinLeaveRecordMapper.xml
+++ b/src/main/resources/mapper/staff/StaffJoinLeaveRecordMapper.xml
@@ -16,6 +16,7 @@
         <if test="staffJoinLeaveRecord.entryDateEnd != null and staffJoinLeaveRecord.entryDateEnd != '' ">
             and contract_end_time like concat('%',#{staffJoinLeaveRecord.entryDateEnd},'%')
         </if>
+        order by create_time desc
     </select>
     <select id="staffJoinLeaveRecordList" resultType="com.ruoyi.staff.pojo.StaffJoinLeaveRecord">
         SELECT
diff --git a/src/main/resources/mapper/staff/StaffSchedulingMapper.xml b/src/main/resources/mapper/staff/StaffSchedulingMapper.xml
new file mode 100644
index 0000000..1a32ef1
--- /dev/null
+++ b/src/main/resources/mapper/staff/StaffSchedulingMapper.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.staff.mapper.StaffSchedulingMapper">
+
+    <resultMap id="BaseResultMap" type="com.ruoyi.staff.pojo.StaffScheduling">
+            <id property="id" column="id" jdbcType="INTEGER"/>
+            <result property="staffId" column="staff_id" jdbcType="INTEGER"/>
+            <result property="department" column="department" jdbcType="INTEGER"/>
+            <result property="shiftType" column="shift_type" jdbcType="INTEGER"/>
+            <result property="workDate" column="work_date" jdbcType="DATE"/>
+            <result property="workStartTime" column="work_start_time" jdbcType="TIMESTAMP"/>
+            <result property="workEndTime" column="work_end_time" jdbcType="TIMESTAMP"/>
+            <result property="workHours" column="work_hours" jdbcType="DECIMAL"/>
+            <result property="status" column="status" jdbcType="INTEGER"/>
+            <result property="remark" column="remark" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="createUser" column="create_user" jdbcType="BIGINT"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="updateUser" column="update_user" jdbcType="BIGINT"/>
+            <result property="tenantId" column="tenant_id" jdbcType="BIGINT"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,staff_id,department,
+        shift_type,work_date,work_start_time,
+        work_end_time,work_hours,status,
+        remark,create_time,create_user,
+        update_time,update_user,tenant_id
+    </sql>
+    <select id="listPage" resultType="com.ruoyi.staff.dto.StaffSchedulingDto">
+        SELECT
+        t1.*,t2.staff_name as 'staff_name' ,t2.staff_no as 'staff_no'
+        FROM staff_scheduling t1
+        left join staff_join_leave_record t2 on t1.staff_id = t2.id
+        where 1=1
+        <if test="vo.staffName != null and vo.staffName != '' ">
+            AND t2.staff_name LIKE CONCAT('%', #{vo.staffName}, '%')
+        </if>
+        <if test="vo.shiftType != null and vo.shiftType != '' ">
+            AND t1.shift_type = #{vo.shiftType}
+        </if>
+        <if test="vo.startDate != null ">
+            AND t1.work_date >=  DATE_FORMAT(#{vo.startDate},'%Y-%m-%d')
+        </if>
+        <if test="vo.endDate != null ">
+            AND t1.work_date  <![CDATA[ <= ]]> DATE_FORMAT(#{vo.endDate},'%Y-%m-%d')
+        </if>
+        ORDER BY t1.create_time DESC
+    </select>
+</mapper>
diff --git a/src/main/resources/mapper/system/SysUserDeptMapper.xml b/src/main/resources/mapper/system/SysUserDeptMapper.xml
index 81c1365..bcf7b01 100644
--- a/src/main/resources/mapper/system/SysUserDeptMapper.xml
+++ b/src/main/resources/mapper/system/SysUserDeptMapper.xml
@@ -19,7 +19,7 @@
             </if>
             <if test="userDeptVo.userName != null and userDeptVo.userName != '' ">
                 AND T1.user_id IN (
-                SELECT user_id FROM sys_user WHERE nick_name LIKE CONCAT('%',#{userDeptVo.userName},'%')
+                SELECT user_id FROM sys_user WHERE user_name LIKE CONCAT('%',#{userDeptVo.userName},'%')
                 )
             </if>
         </where>
diff --git a/src/main/resources/mapper/system/SysUserMapper.xml b/src/main/resources/mapper/system/SysUserMapper.xml
index e1a12c6..f77e62c 100644
--- a/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/src/main/resources/mapper/system/SysUserMapper.xml
@@ -158,6 +158,28 @@
  			#{item}
         </foreach>
 	</select>
+	<select id="selectList" resultType="com.ruoyi.project.system.domain.SysUser">
+		SELECT user_id, nick_name FROM sys_user
+		<where>
+			<if test="list != null and list.size() > 0">
+				user_id IN
+				<foreach item="id" collection="list" open="(" separator="," close=")">
+					#{id}
+				</foreach>
+			</if>
+			<if test="list == null or list.size() == 0">
+				1=0  <!-- 绌哄垪琛ㄦ椂杩斿洖绌虹粨鏋� -->
+			</if>
+		</where>
+	</select>
+	<select id="selectUsersByIds" resultType="com.ruoyi.project.system.domain.SysUser">
+		SELECT user_id, nick_name
+		FROM sys_user
+		WHERE user_id IN
+		<foreach collection="userIds" item="id" open="(" separator="," close=")">
+			#{id}
+		</foreach>
+	</select>
 
 	<insert id="insertUser" parameterType="com.ruoyi.project.system.domain.SysUser" useGeneratedKeys="true" keyProperty="userId">
  		insert into sys_user(
diff --git a/src/main/resources/mapper/warehouse/DocumentClassificationMapper.xml b/src/main/resources/mapper/warehouse/DocumentClassificationMapper.xml
new file mode 100644
index 0000000..e758e4f
--- /dev/null
+++ b/src/main/resources/mapper/warehouse/DocumentClassificationMapper.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.warehouse.mapper.DocumentClassificationMapper">
+
+    <resultMap id="BaseResultMap" type="com.ruoyi.warehouse.pojo.DocumentClassification">
+            <id property="id" column="id" />
+            <result property="category" column="category" />
+            <result property="parentId" column="parent_id" />
+            <result property="createTime" column="create_time" />
+            <result property="createUser" column="create_user" />
+            <result property="updateTime" column="update_time" />
+            <result property="updateUser" column="update_user" />
+            <result property="tenantId" column="tenant_id" />
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,category,parent_id,
+        create_time,create_user,update_time,
+        update_user,tenant_id
+    </sql>
+</mapper>
diff --git a/src/main/resources/mapper/warehouse/DocumentationBorrowManagementMapper.xml b/src/main/resources/mapper/warehouse/DocumentationBorrowManagementMapper.xml
new file mode 100644
index 0000000..18b2082
--- /dev/null
+++ b/src/main/resources/mapper/warehouse/DocumentationBorrowManagementMapper.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.warehouse.mapper.DocumentationBorrowManagementMapper">
+
+<!--    <resultMap id="BaseResultMap" type="com.ruoyi.warehouse.pojo.DocumentationBorrowManagement">-->
+<!--            <id property="id" column="id"/>-->
+<!--            <result property="documentationId" column="documentation_id" />-->
+<!--            <result property="borrowerId" column="borrower_id" />-->
+<!--            <result property="borrowPurpose" column="borrow_purpose" />-->
+<!--            <result property="borrowDate" column="borrow_date"/>-->
+<!--            <result property="dueReturnDate" column="due_return_date" />-->
+<!--            <result property="returnDate" column="return_date"/>-->
+<!--            <result property="borrowStatus" column="borrow_status" />-->
+<!--            <result property="remark" column="remark"/>-->
+<!--            <result property="createTime" column="create_time"/>-->
+<!--            <result property="createUser" column="create_user"/>-->
+<!--            <result property="updateTime" column="update_time"/>-->
+<!--            <result property="updateUser" column="update_user"/>-->
+<!--            <result property="tenantId" column="tenant_id"/>-->
+<!--    </resultMap>-->
+
+<!--    <sql id="Base_Column_List">-->
+<!--        id,documentation_id,borrower_id,-->
+<!--        borrow_purpose,borrow_date,due_return_date,-->
+<!--        return_date,borrow_status,remark,-->
+<!--        create_time,create_user,update_time,-->
+<!--        update_user,tenant_id-->
+<!--    </sql>-->
+    <select id="listPage" resultType="com.ruoyi.warehouse.dto.DocumentationBorrowManagementDto">
+        select dbm.*,doc.doc_name
+        from documentation_borrow_management dbm
+        LEFT JOIN documentation doc on doc.id = dbm.documentation_id
+        where 1=1
+        <if test="documentationBorrowManagement.borrowStatus != null">
+            and borrow_status = #{documentationBorrowManagement.borrowStatus}
+        </if>
+        <if test="documentationBorrowManagement.documentationId != null">
+            and documentation_id = #{documentationBorrowManagement.documentationId}
+        </if>
+        <if test="documentationBorrowManagement.borrower != null">
+            and borrower like concat('%',#{documentationBorrowManagement.borrower},'%')
+        </if>
+        <if test="documentationBorrowManagement.returner != null">
+            and returner like concat('%',#{documentationBorrowManagement.returner},'%')
+        </if>
+        <if test="documentationBorrowManagement.entryDateStart != null and documentationBorrowManagement.entryDateStart != ''">
+            and borrow_date >= DATE_FORMAT(#{documentationBorrowManagement.entryDateStart},'%Y-%m-%d')
+        </if>
+        <if test="documentationBorrowManagement.entryDateEnd != null and documentationBorrowManagement.entryDateEnd != ''">
+            and borrow_date &lt;= DATE_FORMAT(#{documentationBorrowManagement.entryDateEnd},'%Y-%m-%d')
+        </if>
+    </select>
+    <select id="export" resultType="com.ruoyi.warehouse.dto.DocumentationBorrowManagementDto">
+        select dbm.*,doc.doc_name
+        from documentation_borrow_management dbm
+        LEFT JOIN documentation doc on doc.id = dbm.documentation_id
+        where 1=1
+        <if test="documentationBorrowManagement.borrowStatus != null">
+            and borrow_status = #{documentationBorrowManagement.borrowStatus}
+        </if>
+        <if test="documentationBorrowManagement.documentationId != null">
+            and documentation_id = #{documentationBorrowManagement.documentationId}
+        </if>
+        <if test="documentationBorrowManagement.borrower != null">
+            and borrower like concat('%',#{documentationBorrowManagement.borrower},'%')
+        </if>
+        <if test="documentationBorrowManagement.returner != null">
+            and returner like concat('%',#{documentationBorrowManagement.returner},'%')
+        </if>
+        <if test="documentationBorrowManagement.entryDateStart != null and documentationBorrowManagement.entryDateStart != ''">
+            and borrow_date >= DATE_FORMAT(#{documentationBorrowManagement.entryDateStart},'%Y-%m-%d')
+        </if>
+        <if test="documentationBorrowManagement.entryDateEnd != null and documentationBorrowManagement.entryDateEnd != ''">
+            and borrow_date &lt;= DATE_FORMAT(#{documentationBorrowManagement.entryDateEnd},'%Y-%m-%d')
+        </if>
+    </select>
+    <select id="list" resultType="com.ruoyi.warehouse.dto.DocumentationBorrowManagementDto">
+        select dbm.*,doc.doc_name
+        from documentation_borrow_management dbm
+        LEFT JOIN documentation doc on doc.id = dbm.documentation_id
+        <if test="ew != null">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+</mapper>
diff --git a/src/main/resources/mapper/warehouse/DocumentationFileMapper.xml b/src/main/resources/mapper/warehouse/DocumentationFileMapper.xml
new file mode 100644
index 0000000..a8b74f9
--- /dev/null
+++ b/src/main/resources/mapper/warehouse/DocumentationFileMapper.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.ruoyi.warehouse.mapper.DocumentationFileMapper">
+    <select id="documentationFileListPage" resultType="com.ruoyi.warehouse.pojo.DocumentationFile">
+        SELECT
+        *
+        FROM documentation_file
+        where
+        1=1
+        <if test="documentationFile.name != null and documentationFile.name != '' ">
+            AND name = #{documentationFile.name}
+        </if>
+        <if test="documentationFile.documentationId != null">
+            AND documentation_id = #{documentationFile.documentationId}
+        </if>
+    </select>
+</mapper>
diff --git a/src/main/resources/mapper/warehouse/DocumentationMapper.xml b/src/main/resources/mapper/warehouse/DocumentationMapper.xml
new file mode 100644
index 0000000..91f17a9
--- /dev/null
+++ b/src/main/resources/mapper/warehouse/DocumentationMapper.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.warehouse.mapper.DocumentationMapper">
+
+    <select id="listPage" resultType="com.ruoyi.warehouse.dto.DocumentationDto">
+        SELECT
+        doc.*,
+        dc.category,
+        CONCAT(
+            w.warehouse_name, '-',
+            wgs.name, '-',
+            wgsr.row, '灞�-',
+            wgsr.col, '鍒�'
+        ) AS location_info  -- 鍚堝苟鍚庣殑瀛楁鍚�
+        FROM documentation doc
+        LEFT JOIN document_classification dc ON doc.document_classification_id = dc.id
+        LEFT JOIN warehouse_goods_shelves_rowcol wgsr ON wgsr.id = doc.warehouse_goods_shelves_rowcol_id
+        LEFT JOIN warehouse_goods_shelves wgs ON wgs.id = wgsr.warehouse_goods_shelves_id
+        LEFT JOIN warehouse w ON w.id = wgs.warehouse_id
+        where 1=1
+        <if test="documentation.documentClassificationId != null">
+            and doc.document_classification_id = #{documentation.documentClassificationId}
+        </if>
+        <if test="documentation.docName != null">
+            and doc.doc_name = #{documentation.docName}
+        </if>
+        <if test="documentation.docNumber != null">
+            and doc.doc_number = #{documentation.docNumber}
+        </if>
+        <if test="documentation.id != null">
+            and doc.id = #{documentation.id}
+        </if>
+    </select>
+    <select id="listByDocumentClassificationId" resultType="com.ruoyi.warehouse.dto.DocumentationDto">
+        SELECT
+        doc.*,
+        dc.category,
+        CONCAT(
+        w.warehouse_name, '-',
+        wgs.name, '-',
+        wgsr.row, '灞�-',
+        wgsr.col, '鍒�'
+        ) AS location_info  -- 鍚堝苟鍚庣殑瀛楁鍚�
+        FROM documentation doc
+        LEFT JOIN document_classification dc ON doc.document_classification_id = dc.id
+        LEFT JOIN warehouse_goods_shelves_rowcol wgsr ON wgsr.id = doc.warehouse_goods_shelves_rowcol_id
+        LEFT JOIN warehouse_goods_shelves wgs ON wgs.id = wgsr.warehouse_goods_shelves_id
+        LEFT JOIN warehouse w ON w.id = wgs.warehouse_id
+        where doc.document_classification_id = #{documentClassificationId}
+    </select>
+    <select id="list" resultType="com.ruoyi.warehouse.dto.DocumentationDto">
+        SELECT
+            doc.*,
+            dc.category,
+            CONCAT(
+                    w.warehouse_name, '-',
+                    wgs.name, '-',
+                    wgsr.row, '灞�-',
+                    wgsr.col, '鍒�'
+                ) AS location_info  -- 鍚堝苟鍚庣殑瀛楁鍚�
+        FROM documentation doc
+         LEFT JOIN document_classification dc ON doc.document_classification_id = dc.id
+         LEFT JOIN warehouse_goods_shelves_rowcol wgsr ON wgsr.id = doc.warehouse_goods_shelves_rowcol_id
+         LEFT JOIN warehouse_goods_shelves wgs ON wgs.id = wgsr.warehouse_goods_shelves_id
+         LEFT JOIN warehouse w ON w.id = wgs.warehouse_id
+    </select>
+    <select id="listBywarehouseGoodsShelvesRowcolId" resultType="com.ruoyi.warehouse.dto.DocumentationDto">
+        SELECT
+        doc.*,
+        dc.category,
+        CONCAT(
+        w.warehouse_name, '-',
+        wgs.name, '-',
+        wgsr.row, '灞�-',
+        wgsr.col, '鍒�'
+        ) AS location_info  -- 鍚堝苟鍚庣殑瀛楁鍚�
+        FROM documentation doc
+        LEFT JOIN document_classification dc ON doc.document_classification_id = dc.id
+        LEFT JOIN warehouse_goods_shelves_rowcol wgsr ON wgsr.id = doc.warehouse_goods_shelves_rowcol_id
+        LEFT JOIN warehouse_goods_shelves wgs ON wgs.id = wgsr.warehouse_goods_shelves_id
+        LEFT JOIN warehouse w ON w.id = wgs.warehouse_id
+        where doc.warehouse_goods_shelves_rowcol_id = #{warehouseGoodsShelvesRowcolId}
+    </select>
+
+</mapper>
diff --git a/src/main/resources/mapper/warehouse/DocumentationReturnManagementMapper.xml b/src/main/resources/mapper/warehouse/DocumentationReturnManagementMapper.xml
new file mode 100644
index 0000000..06202f8
--- /dev/null
+++ b/src/main/resources/mapper/warehouse/DocumentationReturnManagementMapper.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.warehouse.mapper.DocumentationReturnManagementMapper">
+
+
+    <select id="listPage" resultType="com.ruoyi.warehouse.dto.DocumentationReturnManagementDto">
+        select dbm.*,doc.doc_name
+        from documentation_return_management dbm
+        LEFT JOIN documentation doc on doc.id = dbm.documentation_id
+        where 1=1
+        <if test="documentationReturnManagement.borrowStatus != null">
+            and borrow_status = #{documentationReturnManagement.borrowStatus}
+        </if>
+        <if test="documentationReturnManagement.documentationId != null">
+            and documentation_id = #{documentationReturnManagement.documentationId}
+        </if>
+        <if test="documentationReturnManagement.borrower != null">
+            and borrower like concat('%',#{documentationReturnManagement.borrower},'%')
+        </if>
+        <if test="documentationReturnManagement.returner != null">
+            and returner like concat('%',#{documentationReturnManagement.returner},'%')
+        </if>
+        <if test="documentationReturnManagement.entryDateStart != null and documentationReturnManagement.entryDateStart != ''">
+            and return_date >= DATE_FORMAT(#{documentationReturnManagement.entryDateStart},'%Y-%m-%d')
+        </if>
+        <if test="documentationReturnManagement.entryDateEnd != null and documentationReturnManagement.entryDateEnd != ''">
+            and return_date &lt;= DATE_FORMAT(#{documentationReturnManagement.entryDateEnd},'%Y-%m-%d')
+        </if>
+    </select>
+
+    <select id="exportrevent" resultType="com.ruoyi.warehouse.dto.ReturnExportDto">
+        select dbm.*,doc.doc_name
+        from documentation_return_management dbm
+        LEFT JOIN documentation doc on doc.id = dbm.documentation_id
+        where dbm.returner IS NOT NULL
+        <if test="documentationReturnManagement.borrowStatus != null">
+            and borrow_status = #{documentationReturnManagement.borrowStatus}
+        </if>
+        <if test="documentationReturnManagement.documentationId != null">
+            and documentation_id = #{documentationReturnManagement.documentationId}
+        </if>
+        <if test="documentationReturnManagement.borrower != null">
+            and borrower like concat('%',#{documentationReturnManagement.borrower},'%')
+        </if>
+        <if test="documentationReturnManagement.returner != null">
+            and returner like concat('%',#{documentationReturnManagement.returner},'%')
+        </if>
+        <if test="documentationReturnManagement.entryDateStart != null and documentationReturnManagement.entryDateStart != ''">
+            and return_date >= DATE_FORMAT(#{documentationReturnManagement.entryDateStart},'%Y-%m-%d')
+        </if>
+        <if test="documentationReturnManagement.entryDateEnd != null and documentationReturnManagement.entryDateEnd != ''">
+            and return_date &lt;= DATE_FORMAT(#{documentationReturnManagement.entryDateEnd},'%Y-%m-%d')
+        </if>
+    </select>
+</mapper>
diff --git a/src/main/resources/mapper/warehouse/WarehouseGoodsShelvesMapper.xml b/src/main/resources/mapper/warehouse/WarehouseGoodsShelvesMapper.xml
new file mode 100644
index 0000000..8493e2d
--- /dev/null
+++ b/src/main/resources/mapper/warehouse/WarehouseGoodsShelvesMapper.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.warehouse.mapper.WarehouseGoodsShelvesMapper">
+
+
+    <select id="findList" resultType="com.ruoyi.warehouse.dto.WarehouseGoodsShelvesDto">
+        SELECT
+        doc.doc_name,
+        doc.doc_number,
+        wgs.*,
+        w.warehouse_name,
+        dc.category
+        FROM warehouse_goods_shelves_rowcol wgsr
+        LEFT JOIN warehouse_goods_shelves wgs ON wgs.id = wgsr.warehouse_goods_shelves_id
+        LEFT JOIN warehouse w ON w.id = wgs.warehouse_id
+        LEFT JOIN documentation doc ON doc.warehouse_goods_shelves_rowcol_id = wgsr.id
+        LEFT JOIN document_classification dc ON doc.document_classification_id = dc.id
+        <where>
+            1=1
+            <if test="warehouseGoodsShelves.goodsShelvesName != null and warehouseGoodsShelves.goodsShelvesName != ''">
+                and wgs.goods_shelves_name like concat('%',#{warehouseGoodsShelves.goodsShelvesName},'%')
+            </if>
+            <if test="warehouseGoodsShelves.warehouseId != null">
+                and wgs.warehouse_id = #{warehouseGoodsShelves.warehouseId}
+            </if>
+            <if test="warehouseGoodsShelves.id != null">
+                and wgs.id = #{warehouseGoodsShelves.id}
+            </if>
+        </where>
+    </select>
+    <select id="listAll" resultType="com.ruoyi.warehouse.dto.WarehouseGoodsShelvesDto">
+        select wgs.*,w.warehouse_name from warehouse_goods_shelves wgs
+        LEFT JOIN warehouse w ON w.id = wgs.warehouse_id
+        <where>
+            1=1
+            <if test="warehouseGoodsShelves.goodsShelvesName != null and warehouseGoodsShelves.goodsShelvesName != ''">
+                and goods_shelves_name like concat('%',#{warehouseGoodsShelves.goodsShelvesName},'%')
+            </if>
+            <if test="warehouseGoodsShelves.warehouseId != null">
+                and warehouse_id = #{warehouseGoodsShelves.warehouseId}
+            </if>
+            <if test="warehouseGoodsShelves.id != null">
+                and id = #{warehouseGoodsShelves.id}
+            </if>
+        </where>
+    </select>
+
+
+</mapper>
diff --git a/src/main/resources/mapper/warehouse/WarehouseGoodsShelvesRowcolMapper.xml b/src/main/resources/mapper/warehouse/WarehouseGoodsShelvesRowcolMapper.xml
new file mode 100644
index 0000000..87dfa32
--- /dev/null
+++ b/src/main/resources/mapper/warehouse/WarehouseGoodsShelvesRowcolMapper.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.warehouse.mapper.WarehouseGoodsShelvesRowcolMapper">
+    <select id="findList" resultType="com.ruoyi.warehouse.dto.WarehouseGoodsShelvesRowcolDto">
+--         SELECT
+--         wgsr.*,
+--         w.warehouse_name,
+--         wgs.name,
+--         dc.category
+--         FROM warehouse_goods_shelves_rowcol wgsr
+--         LEFT JOIN documentation doc ON doc.warehouse_goods_shelves_rowcol_id = wgsr.id
+--         LEFT JOIN warehouse_goods_shelves wgs ON wgs.id = wgsr.warehouse_goods_shelves_id
+--         LEFT JOIN warehouse w ON w.id = wgs.warehouse_id
+--         LEFT JOIN document_classification dc ON doc.document_classification_id = dc.id
+        SELECT
+        wgsr.*,
+        w.warehouse_name,
+        wgs.name
+        FROM warehouse_goods_shelves_rowcol wgsr
+        LEFT JOIN warehouse_goods_shelves wgs ON wgs.id = wgsr.warehouse_goods_shelves_id
+        LEFT JOIN warehouse w ON w.id = wgs.warehouse_id
+        <where>
+            1=1
+            <if test="warehouseGoodsShelvesRowcol.row != null">
+                and wgsr.row = #{warehouseGoodsShelvesRowcol.row}
+            </if>
+            <if test="warehouseGoodsShelvesRowcol.col != null">
+                and wgsr.col = #{warehouseGoodsShelvesRowcol.col}
+            </if>
+            <if test="warehouseGoodsShelvesRowcol.warehouseGoodsShelvesId != null">
+                and wgsr.warehouse_goods_shelves_id = #{warehouseGoodsShelvesRowcol.warehouseGoodsShelvesId}
+            </if>
+            <if test="warehouseGoodsShelvesRowcol.id != null">
+                and wgsr.id = #{warehouseGoodsShelvesRowcol.id}
+            </if>
+        </where>
+    </select>
+
+</mapper>
diff --git a/src/main/resources/mapper/warehouse/WarehouseMapper.xml b/src/main/resources/mapper/warehouse/WarehouseMapper.xml
new file mode 100644
index 0000000..dd45695
--- /dev/null
+++ b/src/main/resources/mapper/warehouse/WarehouseMapper.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.warehouse.mapper.WarehouseMapper">
+
+
+    <select id="findList" resultType="com.ruoyi.warehouse.dto.WarehouseDto">
+        SELECT
+        w.*,
+        wgs.name,
+        doc.doc_name,
+        doc.doc_number,
+        dc.category
+        FROM warehouse_goods_shelves_rowcol wgsr
+        LEFT JOIN warehouse_goods_shelves wgs ON wgs.id = wgsr.warehouse_goods_shelves_id
+        LEFT JOIN warehouse w ON w.id = wgs.warehouse_id
+        LEFT JOIN documentation doc ON doc.warehouse_goods_shelves_rowcol_id = wgsr.id
+        LEFT JOIN document_classification dc ON doc.document_classification_id = dc.id
+        <where>
+            1=1
+            <if test="warehouse.warehouseName != null">
+                and w.warehouse_name like concat('%',#{warehouse.warehouseName},'%')
+            </if>
+            <if test="warehouse.id != null">
+                and w.id = #{warehouse.id}
+            </if>
+        </where>
+    </select>
+    <select id="listAll" resultType="com.ruoyi.warehouse.pojo.Warehouse">
+        select * from warehouse
+        <where>
+            1=1
+            <if test="warehouse.warehouseName != null">
+                and warehouse_name like concat('%',#{warehouse.warehouseName},'%')
+            </if>
+            <if test="warehouse.id != null">
+                and w.id = #{warehouse.id}
+            </if>
+        </where>
+    </select>
+</mapper>
diff --git a/src/main/resources/mapper/waterrecord/WaterRecordMapper.xml b/src/main/resources/mapper/waterrecord/WaterRecordMapper.xml
new file mode 100644
index 0000000..e0a9135
--- /dev/null
+++ b/src/main/resources/mapper/waterrecord/WaterRecordMapper.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.waterrecord.mapper.WaterRecordMapper">
+
+    <select id="listPage" resultType="com.ruoyi.waterrecord.pojo.WaterRecord">
+        select
+               t1.*,
+               t2.device_name
+               from water_record t1
+        left join device_ledger t2 on t1.device_model = t2.device_model
+        <where>
+            <if test="req.deviceName != null and req.deviceName != ''">
+                and t2.device_name like concat('%',#{req.deviceName},'%')
+            </if>
+        </where>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mybatis/mybatis-config.xml b/src/main/resources/mybatis/mybatis-config.xml
index 4b8c496..ee4d2a1 100644
--- a/src/main/resources/mybatis/mybatis-config.xml
+++ b/src/main/resources/mybatis/mybatis-config.xml
@@ -13,6 +13,7 @@
         <setting name="defaultExecutorType"      value="SIMPLE" />
 		<!-- 鎸囧畾 MyBatis 鎵�鐢ㄦ棩蹇楃殑鍏蜂綋瀹炵幇 -->
         <setting name="logImpl"                  value="SLF4J"  />
+<!--        <setting name="logImpl"                  value="org.apache.ibatis.logging.stdout.StdOutImpl"  />-->
         <!-- 浣跨敤椹煎嘲鍛藉悕娉曡浆鎹㈠瓧娈� -->
 		<!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
 	</settings>
diff --git a/src/main/resources/static/report-template.docx b/src/main/resources/static/report-template.docx
index 0bc9746..6824a62 100644
--- a/src/main/resources/static/report-template.docx
+++ b/src/main/resources/static/report-template.docx
Binary files differ

--
Gitblit v1.9.3