From 47768d890fbfc1a5f3e93ca26137847361415e9e Mon Sep 17 00:00:00 2001
From: buhuazhen <hua100783@gmail.com>
Date: 星期二, 28 十月 2025 10:54:16 +0800
Subject: [PATCH] Merge branch 'master' into pim_meet
---
 src/main/resources/application-dhdc.yml                                                           |    4 
 src/main/java/com/ruoyi/sales/service/ShippingInfoService.java                                    |   14 
 src/main/resources/application-hsmy.yml                                                           |  219 +
 src/main/resources/mapper/sales/ReceiptPaymentMapper.xml                                          |   22 
 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/common/utils/OrderUtils.java                                              |   55 
 src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java                          |   27 
 src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml                          |   13 
 src/main/resources/mapper/sales/InvoiceLedgerMapper.xml                                           |    2 
 src/main/java/com/ruoyi/device/controller/DeviceDefectRecordController.java                       |   51 
 src/main/resources/application-jsyny.yml                                                          |  219 +
 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/inspectiontask/service/impl/TimingTaskServiceImpl.java                    |  450 ++
 src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java                            |   31 
 src/main/java/com/ruoyi/measuringinstrumentledger/dto/SparePartsDto.java                          |   15 
 src/main/java/com/ruoyi/inspectiontask/controller/InspectionTaskController.java                   |   59 
 src/main/resources/application-cmny.yml                                                           |  219 +
 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/device/pojo/DeviceDefectRecord.java                                       |   51 
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPlanController.java               |   67 
 src/main/resources/mapper/oA/OaProjectPhaseTaskMapper.xml                                         |   34 
 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/sales/mapper/SalesQuotationMapper.java                                    |   14 
 src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java                |  257 +
 src/main/resources/application-hxgy.yml                                                           |  219 +
 src/main/java/com/ruoyi/sales/service/impl/SalesQuotationProductServiceImpl.java                  |   11 
 src/main/resources/mapper/sales/SalesQuotationMapper.xml                                          |   19 
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java             |    5 
 src/main/java/com/ruoyi/collaborativeApproval/service/StaffContactsPersonalService.java           |   11 
 src/main/resources/application-hysn.yml                                                           |    6 
 src/main/resources/mapper/inspectiontask/TimingTaskMapper.xml                                     |    8 
 src/main/java/com/ruoyi/collaborativeApproval/mapper/StaffContactsPersonalMapper.java             |   14 
 src/main/resources/mapper/sales/SalesQuotationProductMapper.xml                                   |   15 
 src/main/java/com/ruoyi/sales/controller/PaymentShippingController.java                           |   70 
 src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java                         |   96 
 src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java                              |   95 
 src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseTaskServiceImpl.java                        |   33 
 src/main/resources/application-bhmy.yml                                                           |  219 +
 src/main/java/com/ruoyi/collaborativeApproval/controller/StaffContactsPersonalController.java     |   42 
 src/main/resources/mapper/sales/ShippingInfoMapper.xml                                            |   44 
 src/main/java/com/ruoyi/sales/dto/ReceiptPaymentDto.java                                          |   14 
 src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java                                              |   68 
 src/main/java/com/ruoyi/oA/pojo/OaProject.java                                                    |  107 
 src/main/java/com/ruoyi/procurementrecord/controller/ReturnManagementController.java              |   69 
 src/main/resources/mapper/system/SysUserMapper.xml                                                |   22 
 src/main/java/com/ruoyi/inspectiontask/controller/TimingTaskController.java                       |   58 
 src/main/java/com/ruoyi/device/mapper/DeviceDefectRecordMapper.java                               |   14 
 src/main/java/com/ruoyi/common/utils/MinioUtils.java                                              |  132 
 src/main/java/com/ruoyi/oA/service/OaProjectPhaseService.java                                     |   21 
 src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java                      |    5 
 src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java                      |  239 +
 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/sales/service/impl/ShippingInfoServiceImpl.java                           |   30 
 src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseServiceImpl.java                            |   62 
 src/main/resources/mapper/device/DeviceLedgerMapper.xml                                           |    5 
 src/main/java/com/ruoyi/procurementrecord/controller/InboundManagementController.java             |   64 
 src/main/java/com/ruoyi/basic/service/StorageBlobService.java                                     |    3 
 src/main/resources/mapper/procurementrecord/InboundManagementMapper.xml                           |   16 
 src/main/java/com/ruoyi/procurementrecord/mapper/ReturnManagementMapper.java                      |   22 
 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/procurementrecord/service/ProcurementRecordService.java                   |    3 
 src/main/java/com/ruoyi/device/service/impl/DeviceDefectRecordServiceImpl.java                    |   67 
 src/main/java/com/ruoyi/account/service/AccountIncomeService.java                                 |    2 
 src/main/resources/application-tymk.yml                                                           |  219 +
 src/main/java/com/ruoyi/inspectiontask/service/QrCodeScanRecordService.java                       |   20 
 src/main/resources/application-phmk.yml                                                           |  219 +
 src/main/java/com/ruoyi/framework/config/SwaggerConfig.java                                       |    4 
 src/main/java/com/ruoyi/inspectiontask/service/impl/SpringContextHolder.java                      |   20 
 src/main/java/com/ruoyi/sales/pojo/SalesLedger.java                                               |   12 
 src/main/resources/application-hsxny.yml                                                          |  219 +
 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/sales/service/impl/SalesLedgerServiceImpl.java                            |   27 
 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/device/dto/DeviceDefectRecordDto.java                                     |   14 
 src/main/java/com/ruoyi/inspectiontask/mapper/QrCodeMapper.java                                   |   11 
 src/main/java/com/ruoyi/basic/pojo/StorageAttachment.java                                         |    4 
 src/main/resources/application-hbxm.yml                                                           |  219 +
 src/main/resources/mapper/procurementrecord/ProcurementPlanMapper.xml                             |   16 
 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      |   11 
 src/main/java/com/ruoyi/warehouse/service/DocumentationBorrowManagementService.java               |    2 
 src/main/java/com/ruoyi/procurementrecord/service/ProcurementPlanService.java                     |   25 
 src/main/resources/application-nydl.yml                                                           |  219 +
 src/main/java/com/ruoyi/measuringinstrumentledger/mapper/SparePartsMapper.java                    |   14 
 src/main/resources/application-prod.yml                                                           |    1 
 src/main/java/com/ruoyi/inspectiontask/dto/InspectionTaskDto.java                                 |   20 
 src/main/java/com/ruoyi/oA/service/OaProjectPhaseTaskService.java                                 |   17 
 src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java                                    |   22 
 src/main/java/com/ruoyi/procurementrecord/service/impl/InboundManagementServiceImpl.java          |   29 
 src/main/resources/application-jlsn.yml                                                           |  219 +
 src/main/java/com/ruoyi/collaborativeApproval/pojo/StaffContactsPersonal.java                     |   43 
 src/main/java/com/ruoyi/inspectiontask/service/impl/QrCodeScanRecordServiceImpl.java              |  194 +
 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/procurementrecord/dto/ProcurementPageDto.java                             |   33 
 src/main/java/com/ruoyi/project/common/CommonController.java                                      |   20 
 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/device/controller/DeviceRepairController.java                             |    3 
 src/main/java/com/ruoyi/inspectiontask/service/QrCodeService.java                                 |   19 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java                         |   42 
 src/main/java/com/ruoyi/sales/mapper/SalesQuotationProductMapper.java                             |   16 
 src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml                           |   18 
 src/main/java/com/ruoyi/inspectiontask/pojo/QrCode.java                                           |   63 
 src/main/resources/application-zyrq.yml                                                           |  219 +
 src/main/resources/mapper/procurementrecord/ProcurementPriceManagementMapper.xml                  |   16 
 src/main/java/com/ruoyi/inspectiontask/pojo/TimingTask.java                                       |  100 
 src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java                                        |    3 
 src/main/java/com/ruoyi/collaborativeApproval/dto/StaffContactsPersonalDTO.java                   |   17 
 src/main/java/com/ruoyi/inspectiontask/pojo/QrCodeScanRecord.java                                 |   73 
 src/main/java/com/ruoyi/inspectiontask/controller/QrCodeController.java                           |   56 
 src/main/java/com/ruoyi/procurementrecord/pojo/InboundManagement.java                             |   73 
 src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementPriceManagementMapper.java            |   23 
 src/main/java/com/ruoyi/inspectiontask/pojo/InspectionTask.java                                   |   84 
 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                       |    6 
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java          |  111 
 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/procurementrecord/service/impl/ProcurementPriceManagementServiceImpl.java |   78 
 src/main/java/com/ruoyi/sales/service/PaymentShippingService.java                                 |   22 
 src/main/java/com/ruoyi/procurementrecord/pojo/ReturnManagement.java                              |   72 
 src/main/java/com/ruoyi/oA/mapper/OaProjectPhaseMapper.java                                       |   18 
 src/main/java/com/ruoyi/warehouse/controller/DocumentationBorrowManagementController.java         |    6 
 src/main/java/com/ruoyi/inspectiontask/mapper/InspectionTaskMapper.java                           |   11 
 src/main/java/com/ruoyi/sales/service/SalesQuotationService.java                                  |   17 
 src/main/resources/mapper/collaborativeApproval/StaffContactsPersonalMapper.xml                   |   27 
 src/main/java/com/ruoyi/basic/service/impl/StorageAttachmentServiceImpl.java                      |   16 
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPriceManagementController.java    |   73 
 src/main/java/com/ruoyi/staff/pojo/StaffJoinLeaveRecord.java                                      |    8 
 src/main/java/com/ruoyi/inspectiontask/dto/QrCodeDto.java                                         |    8 
 src/main/java/com/ruoyi/procurementrecord/service/ProcurementPriceManagementService.java          |   26 
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPlanServiceImpl.java            |   41 
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java                      |   33 
 src/main/resources/application-jjxm.yml                                                           |  219 +
 src/main/java/com/ruoyi/basic/pojo/StorageBlob.java                                               |   47 
 src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java                             |    3 
 src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java                                  |    7 
 src/main/java/com/ruoyi/sales/mapper/ReceiptPaymentMapper.java                                    |    2 
 src/main/resources/application-demo.yml                                                           |    2 
 src/main/java/com/ruoyi/oA/controller/OaProjectController.java                                    |   76 
 src/main/java/com/ruoyi/basic/mapper/StorageAttachmentMapper.java                                 |    2 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java                 |    3 
 src/main/java/com/ruoyi/collaborativeApproval/pojo/DutyPlan.java                                  |   25 
 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/account/service/impl/AccountIncomeServiceImpl.java                        |    8 
 src/main/resources/mapper/device/DeviceDefectRecordMapper.xml                                     |   26 
 src/main/java/com/ruoyi/account/service/AccountExpenseService.java                                |    3 
 src/main/java/com/ruoyi/sales/pojo/SalesQuotation.java                                            |   62 
 src/main/java/com/ruoyi/inspectiontask/mapper/QrCodeScanRecordMapper.java                         |   11 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java                                 |    5 
 src/main/java/com/ruoyi/measuringinstrumentledger/pojo/SpareParts.java                            |   59 
 src/main/java/com/ruoyi/inspectiontask/service/impl/QrCodeServiceImpl.java                        |   54 
 src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementPlanMapper.java                       |   22 
 src/main/resources/application-mkzs.yml                                                           |  219 +
 src/main/java/com/ruoyi/inspectiontask/controller/QrCodeScanRecordController.java                 |   56 
 src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java                               |   46 
 src/main/java/com/ruoyi/device/service/DeviceDefectRecordService.java                             |   15 
 src/main/java/com/ruoyi/oA/dto/OaProjectDto.java                                                  |   26 
 src/main/java/com/ruoyi/inspectiontask/service/TimingTaskService.java                             |   23 
 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/inspectiontask/dto/TimingTaskDto.java                                     |   12 
 src/main/java/com/ruoyi/procurementrecord/mapper/InboundManagementMapper.java                     |   23 
 src/main/java/com/ruoyi/oA/service/impl/OaProjectServiceImpl.java                                 |   69 
 src/main/resources/mapper/oA/OaProjectPhaseMapper.xml                                             |   27 
 src/main/java/com/ruoyi/inspectiontask/service/InspectionTaskService.java                         |   20 
 src/main/resources/application-qlmc.yml                                                           |  219 +
 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/application-hbkj.yml                                                           |  219 +
 src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/SparePartsServiceImpl.java         |   73 
 src/main/java/com/ruoyi/sales/mapper/PaymentShippingMapper.java                                   |   23 
 src/main/resources/application-hckx.yml                                                           |  219 +
 src/main/resources/application-hxsj.yml                                                           |  219 +
 200 files changed, 11,559 insertions(+), 64 deletions(-)
diff --git a/src/main/java/com/ruoyi/account/service/AccountExpenseService.java b/src/main/java/com/ruoyi/account/service/AccountExpenseService.java
index dcff4d9..621641b 100644
--- a/src/main/java/com/ruoyi/account/service/AccountExpenseService.java
+++ b/src/main/java/com/ruoyi/account/service/AccountExpenseService.java
@@ -7,6 +7,7 @@
 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;
@@ -24,4 +25,6 @@
     List<AccountDto3> reportExpense();
 
     Map<String,List<String>> analysis();
+
+    AccountExpense getByInvoiceNumber(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..ab7036a 100644
--- a/src/main/java/com/ruoyi/account/service/AccountIncomeService.java
+++ b/src/main/java/com/ruoyi/account/service/AccountIncomeService.java
@@ -18,4 +18,6 @@
     void accountIncomeExport(HttpServletResponse response, AccountIncome accountIncome);
 
     List<AccountDto3> reportIncome();
+
+    AccountIncome getByInvoiceNumber(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 d17b424..ec1f077 100644
--- a/src/main/java/com/ruoyi/account/service/impl/AccountExpenseServiceImpl.java
+++ b/src/main/java/com/ruoyi/account/service/impl/AccountExpenseServiceImpl.java
@@ -152,5 +152,11 @@
         return result;
     }
 
+    @Override
+    public AccountExpense getByInvoiceNumber(String purchaseContractNumber) {
+        return accountExpenseMapper.selectOne(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..b4188e5 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,11 @@
         }
         return accountDto3s;
     }
+
+    @Override
+    public AccountIncome getByInvoiceNumber(String purchaseContractNumber) {
+        AccountIncome accountIncome = accountIncomeMapper.selectOne(new LambdaQueryWrapper<AccountIncome>()
+                .eq(AccountIncome::getInvoiceNumber, purchaseContractNumber));
+        return accountIncome;
+    }
 }
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/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/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/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/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
index f8d75b9..1a55190 100644
--- a/src/main/java/com/ruoyi/collaborativeApproval/pojo/DutyPlan.java
+++ b/src/main/java/com/ruoyi/collaborativeApproval/pojo/DutyPlan.java
@@ -91,6 +91,31 @@
     @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)
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/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/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/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/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 264f23a..e3538d1 100644
--- a/src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java
+++ b/src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java
@@ -15,6 +15,7 @@
 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;
@@ -101,7 +102,7 @@
     }
 
     @GetMapping("scanDevice")
-    @ApiModelProperty("鑾峰彇璁惧鍙拌处")
+    @ApiOperation("鑾峰彇璁惧鍙拌处")
     @Anonymous
     public AjaxResult scanDevice(Long id) {
         List<DeviceMaintenance> list = deviceMaintenanceMapper.list1(id);
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/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/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/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/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/service/impl/HomeServiceImpl.java b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
index 7dea6df..ad6ca2f 100644
--- a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
+++ b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -374,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..a32dd4b
--- /dev/null
+++ b/src/main/java/com/ruoyi/inspectiontask/controller/InspectionTaskController.java
@@ -0,0 +1,59 @@
+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.InspectionTaskDto;
+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.*;
+
+/**
+ * @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("/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..6b80e1b
--- /dev/null
+++ b/src/main/java/com/ruoyi/inspectiontask/controller/TimingTaskController.java
@@ -0,0 +1,58 @@
+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.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.*;
+
+/**
+ * @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("/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..a94776a
--- /dev/null
+++ b/src/main/java/com/ruoyi/inspectiontask/pojo/InspectionTask.java
@@ -0,0 +1,84 @@
+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:25
+ */
+@Data
+@ApiModel
+@TableName("inspection_task")
+public class InspectionTask {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 宸℃浠诲姟鍞竴鏍囪瘑
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "璁惧鍚嶇О")
+    private String taskName;
+
+    @ApiModelProperty(value = "璁惧id")
+    private Integer taskId;
+
+    @ApiModelProperty(value = "宸℃浜篒D")
+    private String inspectorId;
+
+    @ApiModelProperty(value = "鎵ц宸℃鐨勪汉鍛樺鍚�")
+    private String inspector;
+
+    @ApiModelProperty(value = "浠诲姟闄勫姞璇存槑鎴栫壒娈婃儏鍐佃褰�")
+    private String remarks;
+
+    @ApiModelProperty(value = "浠诲姟鐧昏浜篒D")
+    private Long registrantId;
+
+    @ApiModelProperty(value = "浠诲姟鐧昏浜哄鍚�")
+    private String registrant;
+
+    @ApiModelProperty(value = "棰戞")
+    private String frequencyType;
+
+    @ApiModelProperty(value = "鏃堕棿缁嗚妭")
+    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")
+    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..f9bf88e
--- /dev/null
+++ b/src/main/java/com/ruoyi/inspectiontask/pojo/TimingTask.java
@@ -0,0 +1,100 @@
+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.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 = "璁惧鍚嶇О")
+    private String taskName;
+
+    @ApiModelProperty(value = "璁惧id")
+    private Integer taskId;
+
+    @ApiModelProperty(value = "宸℃浜�")
+    private String inspectorIds;
+
+    @ApiModelProperty(value = "宸℃鍦扮偣")
+    private String inspectionLocation;
+
+    @ApiModelProperty(value = "棰戞")
+    private String frequencyType;
+
+    @ApiModelProperty(value = "棰戞璇︽儏")
+    private String frequencyDetail;
+
+    @ApiModelProperty(value = "涓嬫鎵ц鏃堕棿")
+    private LocalDateTime nextExecutionTime;
+
+    @ApiModelProperty(value = "鏈�鍚庢墽琛屾椂闂�")
+    private LocalDateTime lastExecutionTime;
+
+    @ApiModelProperty(value = "鏄惁婵�娲�")
+    private boolean isActive;
+
+    @ApiModelProperty(value = "澶囨敞")
+    private String remarks;
+
+    @ApiModelProperty(value = "鐧昏浜篿d")
+    private Long registrantId;
+
+    @ApiModelProperty(value = "鐧昏浜�")
+    private String registrant;
+
+    @ApiModelProperty(value = "鐧昏鏃ユ湡")
+    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/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/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/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..4a7b85a 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
@@ -80,6 +80,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/ProcurementDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java
index 63ce258..7864f93 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java
@@ -57,6 +57,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..387a8b5 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;
 
 /**
@@ -112,5 +115,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..5d4810d 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;
 
 /**
@@ -42,8 +43,17 @@
      */
     @Excel(name = "寰呭嚭搴撴暟閲�")
     private BigDecimal inboundNum0;
+    /**
+     * 鍑哄簱鏁伴噺
+     */
+    @Excel(name = "鍑哄簱鏁伴噺")
+    private BigDecimal totalInboundNum;
 
-
+    /**
+     * 鏈�浣庡簱瀛樻暟閲�
+     */
+    @Excel(name = "鏈�浣庡簱瀛樻暟閲�")
+    private BigDecimal minStock;
     /**
      * 鍑哄叆搴撴椂闂�
      */
@@ -124,5 +134,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/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/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/ProcurementRecordStorage.java b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
index 495a8a6..a0f73d9 100644
--- a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
+++ b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
@@ -35,12 +35,17 @@
      * 鍏ュ簱鏁伴噺
      */
     private BigDecimal inboundNum;
+//    /**
+//     * 鏈�浣庡簱瀛樻暟閲�
+//     */
+//    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/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/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/ProcurementRecordServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
index 06612f6..7b7f623 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;
 
 /**
@@ -177,6 +177,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());
@@ -228,6 +234,104 @@
         }
         ExcelUtil<ProcurementPageDtoCopy> util = new ExcelUtil<ProcurementPageDtoCopy>(ProcurementPageDtoCopy.class);
         util.exportExcel(response, list, "搴撳瓨绠$悊");
+    }
+
+    @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
@@ -334,7 +438,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/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/service/impl/PurchaseLedgerServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
index 01b14ff..79041dc 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,39 @@
         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());
+            AccountExpense accountExpenseDB = accountExpenseService.getByInvoiceNumber(purchaseLedger.getPurchaseContractNumber());
+            if (ObjectUtils.isEmpty(accountExpenseDB)) {
+                throw new BaseException("鏀嚭绠$悊鏃犺閲囪喘鍚堝悓鐨勬敮鍑鸿褰�");
+            }
+            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. 澶勭悊瀛愯〃鏁版嵁
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/SalesLedgerController.java b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
index a18d5c4..e968530 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,7 @@
 
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
@@ -44,6 +51,12 @@
     @Autowired
     private InvoiceLedgerMapper invoiceLedgerMapper;
 
+    @Autowired
+    private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
+
+    @Autowired
+    private ReceiptPaymentMapper receiptPaymentMapper;
+
     /**
      * 鏌ヨ閿�鍞彴璐﹀垪琛�
      */
@@ -65,10 +78,10 @@
                 if (salesLedger.getId().intValue() == invoiceLedgerDto.getSalesLedgerId()) {
                     BigDecimal noInvoiceAmountTotal = salesLedger.getContractAmount().subtract(invoiceLedgerDto.getInvoiceTotal());
                     salesLedger.setNoInvoiceAmountTotal(noInvoiceAmountTotal);
-
                 }
             }
         }
+
         return getDataTable(list);
     }
 
@@ -181,6 +194,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 +214,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..6df2ede
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java
@@ -0,0 +1,31 @@
+package com.ruoyi.sales.controller;
+
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.sales.dto.SalesQuotationDto;
+import com.ruoyi.sales.service.SalesQuotationService;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.web.bind.annotation.*;
+
+@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("/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..c49a3b2 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 {
@@ -20,6 +23,17 @@
     @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/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..61a4c36 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -104,14 +104,22 @@
 
     @TableField(exist = false)
     @ApiModelProperty(value = "鏈紑绁ㄩ噾棰�(鍏�)")
-    private BigDecimal noInvoiceAmountTotal;
+    private BigDecimal noInvoiceAmountTotal = BigDecimal.ZERO;
 
     @ApiModelProperty(value = "绛捐鏃ユ湡")
     private LocalDate executionDate;
 
     @TableField(exist = false)
     @ApiModelProperty(value = "宸插紑绁ㄩ噾棰�(鍏�)")
-    private BigDecimal invoiceTotal;
+    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..efa03ec 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -58,7 +58,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..72c4f00
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesQuotation.java
@@ -0,0 +1,62 @@
+package com.ruoyi.sales.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.LocalDate;
+import java.time.LocalDateTime;
+
+@Data
+@TableName("sales_quotation")
+public class SalesQuotation {
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+    @ApiModelProperty(value = "鎶ヤ环鍗曠紪鍙�")
+    private String quotationNo;
+    @ApiModelProperty(value = "瀹㈡埛鍚嶇О")
+    private String customer;
+
+    @ApiModelProperty(value = "涓氬姟鍛�")
+    private String salesperson;
+    @ApiModelProperty(value = "鎶ヤ环鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate quotationDate;
+    @ApiModelProperty(value = "鏈夋晥鏈熻嚦")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate validDate;
+    @ApiModelProperty(value = "浠樻鏂瑰紡")
+    private String paymentMethod;
+    @ApiModelProperty(value = "浜よ揣鍛ㄦ湡澶╂暟")
+    private String deliveryPeriod;
+    @ApiModelProperty(value = "鐘舵��")
+    private String status;
+    @ApiModelProperty(value = "鎶ヤ环鎬婚噾棰�")
+    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/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/SalesLedgerServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
index 37366dc..0cbe9d1 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,36 @@
             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());
+                AccountIncome accountIncomeDB = accountIncomeService.getByInvoiceNumber(salesLedger.getSalesContractNo());
+                if (ObjectUtils.isEmpty(accountIncomeDB)) {
+                    throw new BaseException("鏀跺叆绠$悊鏃犺閿�鍞悎鍚岀殑鏀跺叆璁板綍");
+                }
+                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. 澶勭悊瀛愯〃鏁版嵁
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/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/warehouse/controller/DocumentationBorrowManagementController.java b/src/main/java/com/ruoyi/warehouse/controller/DocumentationBorrowManagementController.java
index d4b44ad..fdf07fd 100644
--- a/src/main/java/com/ruoyi/warehouse/controller/DocumentationBorrowManagementController.java
+++ b/src/main/java/com/ruoyi/warehouse/controller/DocumentationBorrowManagementController.java
@@ -54,6 +54,12 @@
     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)
diff --git a/src/main/java/com/ruoyi/warehouse/service/DocumentationBorrowManagementService.java b/src/main/java/com/ruoyi/warehouse/service/DocumentationBorrowManagementService.java
index 2a162d2..3f76061 100644
--- a/src/main/java/com/ruoyi/warehouse/service/DocumentationBorrowManagementService.java
+++ b/src/main/java/com/ruoyi/warehouse/service/DocumentationBorrowManagementService.java
@@ -33,4 +33,6 @@
     void exportrevent(HttpServletResponse response, DocumentationReturnManagement documentationReturnManagement);
 
     List<DocumentationBorrowManagementDto> listAll();
+
+    List<DocumentationBorrowManagementDto> selectByDocumentationId(Long id);
 }
diff --git a/src/main/java/com/ruoyi/warehouse/service/impl/DocumentationBorrowManagementServiceImpl.java b/src/main/java/com/ruoyi/warehouse/service/impl/DocumentationBorrowManagementServiceImpl.java
index 38b8d5a..4ddf5a2 100644
--- a/src/main/java/com/ruoyi/warehouse/service/impl/DocumentationBorrowManagementServiceImpl.java
+++ b/src/main/java/com/ruoyi/warehouse/service/impl/DocumentationBorrowManagementServiceImpl.java
@@ -133,6 +133,17 @@
     }
 
     @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) {
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-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 7459313..631eb3e 100644
--- a/src/main/resources/application-demo.yml
+++ b/src/main/resources/application-demo.yml
@@ -45,7 +45,7 @@
   accessKey: admin
   secretKey: 12345678
   preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
-  default-bucket: uploadPath
+  default-bucket: demo-product
 # 鐢ㄦ埛閰嶇疆
 user:
   password:
diff --git a/src/main/resources/application-dhdc.yml b/src/main/resources/application-dhdc.yml
index 579ad20..52fbd62 100644
--- a/src/main/resources/application-dhdc.yml
+++ b/src/main/resources/application-dhdc.yml
@@ -62,7 +62,7 @@
     druid:
       # 涓诲簱鏁版嵁婧�
       master:
-        url: jdbc:mysql://192.168.1.195:3306/product-inventory-management-dhdc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        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
       # 浠庡簱鏁版嵁婧�
@@ -135,7 +135,7 @@
   redis:
     # 鍦板潃
 #    host: 127.0.0.1
-    host: 192.168.1.195
+    host: 192.168.1.8
     # 绔彛锛岄粯璁や负6379
     port: 6379
     # 鏁版嵁搴撶储寮�
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-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
index a9fc89b..5d8f467 100644
--- a/src/main/resources/application-hysn.yml
+++ b/src/main/resources/application-hysn.yml
@@ -62,9 +62,9 @@
     druid:
       # 涓诲簱鏁版嵁婧�
       master:
-        url: jdbc:mysql://192.168.1.196:3306/product-inventory-management-hysn?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        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: 123456
+        password: xd@123456..
       # 浠庡簱鏁版嵁婧�
       slave:
         # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
@@ -135,7 +135,7 @@
   redis:
     # 鍦板潃
 #    host: 127.0.0.1
-    host: 192.168.1.196
+    host: 192.168.1.185
     # 绔彛锛岄粯璁や负6379
     port: 6379
     # 鏁版嵁搴撶储寮�
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-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-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-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-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-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/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/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 b2a849f..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,
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/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/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..26f13a8 100644
--- a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
+++ b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
@@ -11,6 +11,7 @@
             t2.specification_model,
             t2.unit,
             t2.quantity,
+            t2.min_stock,
             t2.quantity as quantity0,
             t2.tax_rate,
             t2.tax_inclusive_unit_price,
@@ -89,6 +90,7 @@
         t1.create_user,
         t2.specification_model,
         t2.unit,
+        t2.min_stock,
         t2.tax_rate,
         t2.tax_inclusive_unit_price,
         t2.tax_inclusive_total_price,
@@ -96,6 +98,7 @@
         t1.inbound_batches,
         t1.inbound_num,
         t1.inbound_num as inboundNum0,
+        t1.inbound_num as totalInboundNum,
         t1.create_time,
         t1.update_time,
         t1.create_by
@@ -107,6 +110,21 @@
             <if test="req.supplierName != null and req.supplierName != ''">
                 and t3.supplier_name like  concat('%',#{req.supplierName},'%')
             </if>
+            <if test="req.reportDate != null">
+                and t1.create_time >= #{req.reportDate} and t1.create_time < 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 <= #{req.endMonth}
+            </if>
+            <if test="req.startDate != null">
+                and t1.create_time >= #{req.startDate}
+            </if>
+            <if test="req.endDate != null">
+                and t1.create_time <= #{req.endDate}
+            </if>
         </where>
     </select>
     <select id="listCopy" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy">
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/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 b70a04b..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 >= DATE_FORMAT(#{req.invoiceDateStart},'%Y-%m-%d')
+            </if>
+            <if test="req.invoiceDateEnd != null and req.invoiceDateEnd != '' ">
+                AND  T1.invoice_date <= DATE_FORMAT(#{req.invoiceDateEnd},'%Y-%m-%d')
             </if>
         </where>
         ORDER BY T2.create_time DESC
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/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(
--
Gitblit v1.9.3