From 47806d9e390ee00e1d29ad1da8c1aa908882a758 Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期二, 11 八月 2026 14:43:59 +0800
Subject: [PATCH] 用河南鹤壁代码覆盖山西长治

---
 src/main/java/com/ruoyi/safe/controller/SafeTrainingDetailsController.java                              |    3 
 src/main/java/com/ruoyi/stock/service/StockInventoryService.java                                        |    3 
 src/main/java/com/ruoyi/production/bean/dto/ProductionPlanImportDto.java                                |    4 
 src/main/java/com/ruoyi/staff/mapper/PersonalShiftMapper.java                                           |    2 
 src/main/java/com/ruoyi/sales/service/ShippingInfoService.java                                          |    2 
 src/main/java/com/ruoyi/approve/controller/ApproveProcessConfigNodeController.java                      |    3 
 src/main/java/com/ruoyi/sales/controller/SalespersonManagementController.java                           |    5 
 src/main/java/com/ruoyi/collaborativeApproval/service/impl/MeetingServiceImpl.java                      |    4 
 src/main/java/com/ruoyi/common/utils/OrderUtils.java                                                    |   19 
 src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java                                         |   57 
 src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingOperationParamController.java       |    5 
 src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java                                |  163 
 src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsVo.java                                         |   14 
 src/main/java/com/ruoyi/staff/service/impl/StaffLeaveServiceImpl.java                                   |    1 
 src/main/resources/mapper/basic/ProductModelMapper.xml                                                  |   14 
 src/main/java/com/ruoyi/aftersalesservice/dto/AfterSalesServiceExeclDto.java                            |    8 
 src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml                                |    3 
 src/main/java/com/ruoyi/device/controller/DeviceDefectRecordController.java                             |    5 
 src/main/resources/application-ytjz.yml                                                                 |  266 +
 src/main/resources/application-dev.yml                                                                  |   34 
 src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java                               |    1 
 src/main/java/com/ruoyi/staff/service/StaffSalaryMainService.java                                       |    8 
 src/main/java/com/ruoyi/safe/controller/SafeCertificationFileController.java                            |    4 
 src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java                              |    7 
 src/main/java/com/ruoyi/technology/controller/TechnologyOperationController.java                        |    8 
 src/main/java/com/ruoyi/production/controller/ProductionOrderController.java                            |    5 
 src/main/java/com/ruoyi/purchase/pojo/PurchaseReturnOrders.java                                         |   13 
 src/main/java/com/ruoyi/quality/pojo/QualityUnqualified.java                                            |    4 
 src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml                                  |   28 
 src/main/java/com/ruoyi/staff/pojo/StaffSalaryDetail.java                                               |    3 
 src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java                          |    3 
 src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java                                  |    6 
 src/main/java/com/ruoyi/staff/controller/PersonalAttendanceLocationConfigController.java                |   38 
 src/main/java/com/ruoyi/basic/vo/CustomerVo.java                                                        |    5 
 src/main/java/com/ruoyi/sales/dto/ShippingInfoDto.java                                                  |    4 
 src/main/resources/application-dyzn.yml                                                                 |  267 +
 src/main/java/com/ruoyi/inspectiontask/controller/InspectionTaskController.java                         |   11 
 src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnManagementServiceImpl.java                 |   56 
 src/main/resources/mapper/system/SysPostMapper.xml                                                      |   31 
 src/main/java/com/ruoyi/stock/service/StockOutRecordService.java                                        |    4 
 src/main/java/com/ruoyi/approve/controller/NotificationManagementController.java                        |    7 
 src/main/resources/mapper/system/SysDictTypeMapper.xml                                                  |   25 
 src/main/resources/mapper/aftersalesservice/AfterSalesNearExpiryMapper.xml                              |   23 
 src/main/resources/application-jhjm.yml                                                                 |  269 +
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPlanController.java                     |   10 
 src/main/java/com/ruoyi/safe/controller/SafeAccidentController.java                                     |    5 
 src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java                      |    1 
 src/main/resources/mapper/production/ProductionProductInputMapper.xml                                   |   10 
 src/main/java/com/ruoyi/account/controller/sales/AccountInvoiceApplicationController.java               |    8 
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseReturnOrdersServiceImpl.java                      |   14 
 src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml                                          |   37 
 src/main/resources/mapper/sales/SalesQuotationMapper.xml                                                |   28 
 pom.xml                                                                                                 |   57 
 src/main/resources/mapper/collaborativeApproval/NoticeMapper.xml                                        |    3 
 src/main/resources/mapper/collaborativeApproval/RulesRegulationsManagementMapper.xml                    |    3 
 src/main/resources/mapper/account/purchase/AccountPaymentApplicationMapper.xml                          |   13 
 src/main/java/com/ruoyi/projectManagement/controller/PlanController.java                                |    4 
 src/main/java/com/ruoyi/staff/controller/PersonalShiftController.java                                   |    7 
 src/main/java/com/ruoyi/sales/controller/PaymentShippingController.java                                 |    8 
 src/main/java/com/ruoyi/technology/service/impl/TechnologyOperationServiceImpl.java                     |   21 
 src/main/resources/financial-agent-prompt.txt                                                           |   12 
 src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java                               |  157 
 src/main/resources/mapper/staff/StaffLeaveMapper.xml                                                    |   32 
 src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java                                    |   23 
 src/main/resources/mapper/procurementrecord/ReturnSaleProductMapper.xml                                 |   15 
 src/main/java/com/ruoyi/projectManagement/controller/InfoController.java                                |    7 
 src/main/resources/application-btyxpro.yml                                                              |  266 +
 src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java                             |  132 
 src/main/java/com/ruoyi/collaborativeApproval/controller/SealApplicationManagementController.java       |    5 
 src/main/resources/application-xswh.yml                                                                 |  266 +
 src/main/resources/mapper/account/sales/AccountSalesInvoiceMapper.xml                                   |    1 
 src/main/java/com/ruoyi/procurementrecord/controller/GasTankWarningController.java                      |    7 
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java                   |   23 
 src/main/java/com/ruoyi/purchase/mapper/PurchaseLedgerMapper.java                                       |    2 
 src/main/java/com/ruoyi/purchase/vo/PurchaseStockInProductVo.java                                       |    3 
 src/main/java/com/ruoyi/account/bean/vo/sales/SalesReturnVo.java                                        |   16 
 src/main/java/com/ruoyi/collaborativeApproval/controller/StaffContactsPersonalController.java           |    4 
 src/main/resources/mapper/sales/ShippingInfoMapper.xml                                                  |   12 
 src/main/resources/mapper/approve/ApproveProcessMapper.xml                                              |    6 
 src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java                               |   50 
 src/main/java/com/ruoyi/production/controller/ProductionOrderPickController.java                        |    4 
 src/main/java/com/ruoyi/quality/controller/QualityInspectFileController.java                            |    4 
 src/main/java/com/ruoyi/sales/dto/SalesTrendDto.java                                                    |    1 
 src/main/resources/application-qxy.yml                                                                  |  269 +
 src/main/java/com/ruoyi/staff/service/impl/StaffSalaryMainServiceImpl.java                              |  182 
 src/main/java/com/ruoyi/procurementrecord/controller/ReturnManagementController.java                    |    5 
 src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsDetailsVo.java                                  |   11 
 src/main/resources/mapper/system/SysUserMapper.xml                                                      |  612 +-
 src/main/java/com/ruoyi/inspectiontask/controller/TimingTaskController.java                             |    5 
 src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java                                   |    4 
 src/main/resources/application.yml                                                                      |   10 
 src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java                                                 |    8 
 src/main/java/com/ruoyi/project/tool/swagger/TestController.java                                        |   49 
 src/main/java/com/ruoyi/project/system/mapper/SysUserDeptMapper.java                                    |   25 
 src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java                                |    9 
 src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java                                   |   31 
 src/main/java/com/ruoyi/approve/controller/KnowledgeBaseController.java                                 |  146 
 src/main/java/com/ruoyi/collaborativeApproval/controller/NoticeTypeController.java                      |    4 
 src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java                            |   30 
 src/main/java/com/ruoyi/account/service/sales/AccountInvoiceApplicationService.java                     |    2 
 src/main/java/com/ruoyi/sales/vo/CustomerTransactionsDetailsVo.java                                     |   11 
 src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java                                 |   70 
 src/main/resources/mapper/staff/StaffOnJobMapper.xml                                                    |  108 
 src/main/resources/application-sdtx.yml                                                                 |  272 +
 src/main/java/com/ruoyi/staff/controller/StaffSchedulingController.java                                 |    3 
 src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingController.java                     |    8 
 src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java                         |  142 
 src/main/java/com/ruoyi/procurementrecord/controller/InboundManagementController.java                   |    5 
 src/main/java/com/ruoyi/account/bean/vo/sales/SalesOutboundVo.java                                      |    5 
 src/main/resources/application-jhsn.yml                                                                 |  266 +
 src/main/resources/application-skjs.yml                                                                 |  267 +
 src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java                                     |  249 +
 src/main/resources/application-xcdq.yml                                                                 |  272 +
 src/main/resources/mapper/stock/StockOutRecordMapper.xml                                                |    2 
 src/main/java/com/ruoyi/staff/mapper/StaffOnJobMapper.java                                              |    4 
 src/main/java/com/ruoyi/quality/service/IQualityInspectService.java                                     |    3 
 src/main/resources/application-hylq.yml                                                                 |  266 +
 src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationParamController.java            |    6 
 src/main/java/com/ruoyi/basic/enums/ApplicationTypeEnum.java                                            |    3 
 src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java                               |   40 
 src/main/java/com/ruoyi/technology/service/TechnologyOperationService.java                              |    2 
 src/main/resources/application-xlzn.yml                                                                 |  266 +
 src/main/java/com/ruoyi/warehouse/controller/DocumentationFileController.java                           |    4 
 src/main/java/com/ruoyi/technology/controller/TechnologyRoutingController.java                          |   11 
 src/main/resources/mapper/account/sales/AccountInvoiceApplicationMapper.xml                             |   32 
 src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java                                                |    4 
 src/main/java/com/ruoyi/purchase/service/impl/ProcurementBusinessSummaryServiceImpl.java                |    5 
 src/main/java/com/ruoyi/projectManagement/controller/RolesController.java                               |    9 
 src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationController.java                 |   14 
 src/main/java/com/ruoyi/safe/controller/SafeHazardController.java                                       |    5 
 src/main/java/com/ruoyi/staff/controller/StaffSalaryMainController.java                                 |   18 
 src/main/resources/mapper/warehouse/DocumentationBorrowManagementMapper.xml                             |    1 
 src/main/resources/mapper/production/ProductionPlanMapper.xml                                           |    2 
 src/main/java/com/ruoyi/aftersalesservice/pojo/AfterSalesService.java                                   |    9 
 src/main/resources/mapper/measuringinstrumentledger/MeasuringInstrumentLedgerRecordMapper.xml           |    4 
 src/main/java/com/ruoyi/account/service/impl/sales/AccountInvoiceApplicationServiceImpl.java            |    5 
 src/main/java/com/ruoyi/procurementrecord/controller/ReturnSaleProductController.java                   |    2 
 .gitignore                                                                                              |    6 
 src/main/resources/mapper/device/DeviceMaintenanceMapper.xml                                            |   36 
 src/main/java/com/ruoyi/sales/pojo/SalesLedger.java                                                     |    5 
 src/main/resources/application-xhzg.yml                                                                 |  269 +
 src/main/resources/mapper/collaborativeApproval/SealApplicationManagementMapper.xml                     |    1 
 src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java                      |    8 
 src/main/java/com/ruoyi/purchase/controller/PurchaseReturnOrdersController.java                         |   15 
 src/main/resources/mapper/purchase/PurchaseReturnOrdersMapper.xml                                       |   89 
 src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java                                       |    1 
 src/main/resources/mapper/staff/SchemeApplicableStaffMapper.xml                                         |   14 
 src/main/java/com/ruoyi/approve/utils/ApproveProcessConfigNodeUtils.java                                |  363 -
 src/main/resources/mapper/production/ProductionProductOutputMapper.xml                                  |    4 
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java                                  |  177 
 src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java                               |   35 
 src/main/java/com/ruoyi/basic/mapper/CustomerMapper.java                                                |   55 
 .vscode/settings.json                                                                                   |    3 
 src/main/java/com/ruoyi/basic/controller/StorageAttachmentController.java                               |    4 
 src/main/java/com/ruoyi/basic/vo/ProductModelVo.java                                                    |    4 
 src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java                                             |   16 
 src/main/resources/mapper/stock/StockInventoryMapper.xml                                                |   11 
 src/main/java/com/ruoyi/framework/config/ApplicationConfig.java                                         |   94 
 src/main/java/com/ruoyi/device/controller/DeviceMaintenanceFileController.java                          |    4 
 src/main/java/com/ruoyi/project/system/domain/SysUser.java                                              |   78 
 src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java                                          |    3 
 src/main/java/com/ruoyi/safe/controller/SafeTrainingFileController.java                                 |    4 
 src/main/java/com/ruoyi/account/service/impl/sales/AccountSalesCollectionServiceImpl.java               |   18 
 src/main/java/com/ruoyi/staff/pojo/StaffOnJob.java                                                      |    1 
 src/main/java/com/ruoyi/production/service/ProductionOrderRoutingOperationService.java                  |    1 
 src/main/java/com/ruoyi/safe/controller/SafeCertificationController.java                                |    5 
 src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsRequisitionRecordController.java |    3 
 src/main/java/com/ruoyi/procurementrecord/bean/dto/ReturnManagementDto.java                             |   15 
 src/main/java/com/ruoyi/production/mapper/ProductionOperationTaskMapper.java                            |    3 
 src/main/java/com/ruoyi/RuoYiApplication.java                                                           |    4 
 src/main/java/com/ruoyi/approve/pojo/KnowledgeBase.java                                                 |   15 
 src/main/java/com/ruoyi/collaborativeApproval/vo/SearchMeetingUseVo.java                                |    2 
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementExceptionRecordController.java          |    4 
 src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml                                             |   69 
 src/main/java/com/ruoyi/stock/service/StockInRecordService.java                                         |    2 
 src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java                                     |  154 
 src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java                                          |  134 
 src/main/resources/application-sdks.yml                                                                 |  269 +
 src/main/resources/mapper/sales/SalesLedgerProductMapper.xml                                            |  140 
 src/main/java/com/ruoyi/technology/pojo/TechnologyRouting.java                                          |    1 
 src/main/java/com/ruoyi/quality/service/impl/QualityTestStandardBindingServiceImpl.java                 |    7 
 src/main/java/com/ruoyi/technology/controller/TechnologyOperationParamController.java                   |    2 
 src/main/java/com/ruoyi/collaborativeApproval/controller/MeetingController.java                         |   10 
 src/main/java/com/ruoyi/project/common/CommonController.java                                            |    4 
 src/main/java/com/ruoyi/safe/controller/SafeHazardRecordController.java                                 |    5 
 src/main/java/com/ruoyi/sales/pojo/SalesQuotationProduct.java                                           |    5 
 src/main/java/com/ruoyi/device/controller/DeviceRepairController.java                                   |    8 
 src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java                                           |    2 
 src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationParamServiceImpl.java    |   12 
 src/main/java/com/ruoyi/staff/pojo/PersonalAttendanceLocationConfig.java                                |   22 
 src/main/resources/mapper/aftersalesservice/AfterSalesServiceMapper.xml                                 |    4 
 src/main/java/com/ruoyi/projectManagement/pojo/Roles.java                                               |    1 
 src/main/resources/mapper/warehouse/DocumentationMapper.xml                                             |    1 
 src/main/resources/mapper/staff/StaffSalaryMainMapper.xml                                               |    7 
 src/main/java/com/ruoyi/account/bean/vo/purchase/PurchaseReturnVo.java                                  |   16 
 src/main/java/com/ruoyi/safe/controller/SafeHiddenController.java                                       |    5 
 src/main/resources/mapper/measuringinstrumentledger/MeasuringInstrumentLedgerMapper.xml                 |    2 
 src/main/resources/mapper/sales/SalesLedgerMapper.xml                                                   |   21 
 src/main/resources/mapper/technology/TechnologyOperationParamMapper.xml                                 |    2 
 src/main/resources/mapper/basic/SupplierManageMapper.xml                                                |   60 
 src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java                                              |   22 
 src/main/java/com/ruoyi/safe/controller/SafeTrainingController.java                                     |    7 
 src/main/java/com/ruoyi/procurementrecord/bean/dto/ReturnSaleProductDto.java                            |    3 
 src/main/java/com/ruoyi/production/bean/vo/ProductionOrderVo.java                                       |    3 
 src/main/java/com/ruoyi/staff/dto/StaffLeaveDto.java                                                    |    1 
 src/main/java/com/ruoyi/basic/controller/SupplierManageFileController.java                              |    4 
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java                           |   66 
 src/main/java/com/ruoyi/other/controller/PdaVersionController.java                                      |    3 
 src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementFileController.java  |    4 
 src/main/resources/mapper/account/purchase/AccountPurchaseInvoiceMapper.xml                             |    1 
 src/main/resources/mapper/quality/QualityTestStandardMapper.xml                                         |    1 
 src/main/java/com/ruoyi/inspectiontask/controller/QrCodeController.java                                 |    8 
 src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java                              |   54 
 src/main/resources/application-lmjn.yml                                                                 |  268 +
 src/main/java/com/ruoyi/staff/controller/HolidayApplicationController.java                              |    5 
 src/main/java/com/ruoyi/safe/controller/SafeHiddenFileController.java                                   |    4 
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java                |    7 
 src/main/java/com/ruoyi/approve/controller/RpaProcessAutomationController.java                          |    6 
 src/main/resources/mapper/quality/QualityInspectMapper.xml                                              |  328 
 src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java                             |   50 
 src/main/java/com/ruoyi/procurementrecord/pojo/ReturnManagement.java                                    |   13 
 src/main/resources/mapper/warehouse/DocumentationReturnManagementMapper.xml                             |    1 
 src/main/java/com/ruoyi/technology/pojo/TechnologyParam.java                                            |    6 
 src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java                       |    4 
 src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java                             |   46 
 src/main/java/com/ruoyi/staff/dto/StaffOnJobDto.java                                                    |    2 
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPriceManagementController.java          |   10 
 src/main/resources/application-hyjc.yml                                                                 |  266 +
 src/main/resources/mapper/basic/CustomerMapper.xml                                                      |  124 
 src/main/java/com/ruoyi/production/controller/ProductionOperationTaskController.java                    |    8 
 src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java                                    |   11 
 src/main/resources/mapper/system/SysNoticeMapper.xml                                                    |    5 
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java                            |  746 --
 src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java                                                  |    1 
 src/main/java/com/ruoyi/officesupplies/controller/OfficeSuppliesController.java                         |    3 
 src/main/java/com/ruoyi/staff/mapper/SchemeApplicableStaffMapper.java                                   |    7 
 src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java                                   |    8 
 src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java                                        |    5 
 src/main/java/com/ruoyi/production/service/impl/ProductionPlanServiceImpl.java                          |    2 
 src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceLocationConfigServiceImpl.java             |   31 
 src/main/java/com/ruoyi/sales/vo/CustomerTransactionsVo.java                                            |   14 
 src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java                       |    4 
 src/main/java/com/ruoyi/production/controller/ProductionBomStructureController.java                     |    3 
 src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java                                             |    1 
 src/main/resources/mapper/production/ProductionAccountMapper.xml                                        |    4 
 src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java                        |  209 
 src/main/resources/mapper/technology/TechnologyOperationMapper.xml                                      |    2 
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java                               |   24 
 src/main/java/com/ruoyi/basic/controller/SupplierManageController.java                                  |    4 
 src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementController.java      |    8 
 src/main/resources/application-zqsy.yml                                                                 |  269 +
 src/main/java/com/ruoyi/production/enums/ProductOrderStatusEnum.java                                    |   11 
 src/main/java/com/ruoyi/project/system/service/impl/SysNoticeServiceImpl.java                           |   91 
 src/main/java/com/ruoyi/customervisits/service/impl/CustomerVisitsServiceImpl.java                      |    2 
 src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java                                      |    9 
 src/main/resources/mapper/stock/StockInRecordMapper.xml                                                 |   10 
 src/main/java/com/ruoyi/collaborativeApproval/controller/DutyPlanController.java                        |    6 
 src/main/java/com/ruoyi/production/bean/vo/ProcessRouteStatusVo.java                                    |   17 
 src/main/java/com/ruoyi/purchase/dto/PurchaseReturnOrderHasAllInfoDto.java                              |    7 
 src/main/java/com/ruoyi/quality/pojo/QualityInspect.java                                                |   23 
 src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java                                |  128 
 src/main/resources/mapper/production/ProductionOperationTaskMapper.xml                                  |   22 
 src/main/java/com/ruoyi/aftersalesservice/service/impl/AfterSalesServiceServiceImpl.java                |   37 
 src/main/resources/application-ddgw.yml                                                                 |  269 +
 src/main/resources/mapper/staff/PersonalAttendanceRecordsMapper.xml                                     |   10 
 src/main/java/com/ruoyi/sales/service/impl/MetricStatisticsServiceImpl.java                             |   67 
 src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java                                                   |    2 
 src/main/resources/application-tddq.yml                                                                 |  269 +
 src/main/java/com/ruoyi/sales/pojo/SalesQuotation.java                                                  |    1 
 src/main/java/com/ruoyi/common/utils/DateUtils.java                                                     |   21 
 src/main/java/com/ruoyi/account/service/impl/financial/AccountSubjectServiceImpl.java                   |    6 
 src/main/java/com/ruoyi/home/controller/HomeController.java                                             |   42 
 src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceRecordsServiceImpl.java                    |   14 
 src/main/java/com/ruoyi/account/mapper/sales/AccountInvoiceApplicationMapper.java                       |    2 
 src/main/java/com/ruoyi/staff/controller/StaffLeaveController.java                                      |    6 
 src/main/java/com/ruoyi/inspectiontask/controller/QrCodeScanRecordController.java                       |    8 
 src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java                                     |   12 
 src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java                                  |   11 
 src/main/java/com/ruoyi/safe/controller/SafeContingencyPlanController.java                              |    5 
 src/main/java/com/ruoyi/approve/controller/HolidaySettingsController.java                               |   14 
 src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java                                |   12 
 src/main/java/com/ruoyi/purchase/vo/PurchaseReturnOrderProductsDetailVo.java                            |    3 
 src/main/java/com/ruoyi/sales/dto/SalesQuotationDto.java                                                |    2 
 src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java                                               |    9 
 src/main/resources/mapper/account/purchase/AccountPurchasePaymentMapper.xml                             |    1 
 src/main/java/com/ruoyi/stock/pojo/StockInRecord.java                                                   |    7 
 src/main/resources/mapper/account/sales/AccountSalesCollectionMapper.xml                                |   77 
 src/main/resources/application-yjyy.yml                                                                 |  267 +
 src/main/java/com/ruoyi/production/bean/vo/ProductionOrderProcessTaskVo.java                            |   20 
 src/main/resources/mapper/staff/PersonalShiftMapper.xml                                                 |   26 
 src/main/java/com/ruoyi/staff/mapper/StaffSalaryMainMapper.java                                         |    4 
 src/main/resources/mapper/production/ProductionOrderMapper.xml                                          |    8 
 src/main/java/com/ruoyi/common/utils/AmountUtils.java                                                   |  124 
 src/main/java/com/ruoyi/technology/controller/TechnologyBomStructureController.java                     |    3 
 src/main/resources/mapper/approve/KnowledgeBaseMapper.xml                                               |    4 
 src/main/resources/application-zxzn.yml                                                                 |  266 +
 src/main/java/com/ruoyi/sales/pojo/PaymentShipping.java                                                 |    1 
 src/main/java/com/ruoyi/quality/controller/QualityTestStandardParamController.java                      |    4 
 src/main/resources/mapper/device/DeviceRepairMapper.xml                                                 |   42 
 src/main/java/com/ruoyi/procurementrecord/bean/vo/ShippingProductVo.java                                |    3 
 src/main/resources/mapper/warehouse/WarehouseGoodsShelvesRowcolMapper.xml                               |    1 
 src/main/java/com/ruoyi/production/pojo/ProductionOrder.java                                            |    1 
 src/main/java/com/ruoyi/staff/service/PersonalAttendanceLocationConfigService.java                      |   15 
 src/main/resources/mapper/system/SysDeptMapper.xml                                                      |   39 
 src/main/resources/mapper/system/SysRoleMapper.xml                                                      |   32 
 src/main/resources/application-dtzg.yml                                                                 |  266 +
 306 files changed, 9,138 insertions(+), 4,761 deletions(-)

diff --git a/.gitignore b/.gitignore
index 7b54453..797d1c7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,13 +6,11 @@
 !gradle/wrapper/gradle-wrapper.jar
 claude.md
 target/
-src/test/
+test/
 !.mvn/wrapper/maven-wrapper.jar
 
 ######################################################################
-# Claude Code
-.claude/
-
+# IDE
 
 ### STS ###
 .apt_generated
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..8f2b711
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+    "java.compile.nullAnalysis.mode": "disabled"
+}
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index e840acd..438b235 100644
--- a/pom.xml
+++ b/pom.xml
@@ -53,27 +53,10 @@
         <getui-sdk.version>1.0.7.0</getui-sdk.version>
         <jsqlparser.version>4.9</jsqlparser.version>
         <thumbnailator.version>0.4.20</thumbnailator.version>
-        <langchain4j.version>1.0.0-beta3</langchain4j.version>
+
     </properties>
 
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>dev.langchain4j</groupId>
-                <artifactId>langchain4j-bom</artifactId>
-                <version>${langchain4j.version}</version>
-                <type>pom</type>
-                <scope>import</scope>
-            </dependency>
-            <dependency>
-                <groupId>dev.langchain4j</groupId>
-                <artifactId>langchain4j-community-bom</artifactId>
-                <version>${langchain4j.version}</version>
-                <type>pom</type>
-                <scope>import</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
+
 
     <dependencies>
         <!-- ruoyi-springboot2 / swagger knife4j 閰嶇疆 -->
@@ -133,10 +116,7 @@
             <artifactId>spring-boot-starter-data-redis</artifactId>
         </dependency>
 
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-data-mongodb</artifactId>
-        </dependency>
+
 
         <!-- pool 瀵硅薄姹� -->
         <dependency>
@@ -144,38 +124,7 @@
             <artifactId>commons-pool2</artifactId>
         </dependency>
 
-        <dependency>
-            <groupId>dev.langchain4j</groupId>
-            <artifactId>langchain4j-spring-boot-starter</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>dev.langchain4j</groupId>
-            <artifactId>langchain4j-pinecone</artifactId>
-        </dependency>
 
-        <dependency>
-            <groupId>dev.langchain4j</groupId>
-            <artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>dev.langchain4j</groupId>
-            <artifactId>langchain4j-reactor</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>dev.langchain4j</groupId>
-            <artifactId>langchain4j-ollama-spring-boot-starter</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>dev.langchain4j</groupId>
-            <artifactId>langchain4j-community-dashscope-spring-boot-starter</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>dev.langchain4j</groupId>
-            <artifactId>langchain4j-mcp</artifactId>
-        </dependency>
 
         <!-- Mysql椹卞姩鍖� -->
         <dependency>
diff --git a/src/main/java/com/ruoyi/RuoYiApplication.java b/src/main/java/com/ruoyi/RuoYiApplication.java
index 97efe32..074bcd7 100644
--- a/src/main/java/com/ruoyi/RuoYiApplication.java
+++ b/src/main/java/com/ruoyi/RuoYiApplication.java
@@ -7,11 +7,11 @@
 
 /**
  * 鍚姩绋嬪簭
- * 
+ *
  * @author ruoyi
  */
 @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
-@EnableScheduling
+//@EnableScheduling
 public class RuoYiApplication
 {
     public static void main(String[] args)
diff --git a/src/main/java/com/ruoyi/account/bean/vo/purchase/PurchaseReturnVo.java b/src/main/java/com/ruoyi/account/bean/vo/purchase/PurchaseReturnVo.java
index 4c21ac5..82a90a3 100644
--- a/src/main/java/com/ruoyi/account/bean/vo/purchase/PurchaseReturnVo.java
+++ b/src/main/java/com/ruoyi/account/bean/vo/purchase/PurchaseReturnVo.java
@@ -29,22 +29,6 @@
     @Excel(name = "鍏宠仈鍏ュ簱鍗曞彿")
     private String inboundBatches;
 
-    @Schema(description = "鍙戣揣绫诲瀷")
-    @Excel(name = "鍙戣揣绫诲瀷")
-    private Integer shippingType;
-
-    @Schema(description = "鍙戣揣杞︾墝鍙�")
-    @Excel(name = "鍙戣揣杞︾墝鍙�")
-    private String truckPlateNo;
-
-    @Schema(description = "蹇�掑叕鍙�")
-    @Excel(name = "蹇�掑叕鍙�")
-    private String expressCompany;
-
-    @Schema(description = "蹇�掑崟鍙�")
-    @Excel(name = "蹇�掑崟鍙�")
-    private String expressNo;
-
     @Schema(description = "閫�璐ф棩鏈�")
     @Excel(name = "閫�璐ф棩鏈�")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
diff --git a/src/main/java/com/ruoyi/account/bean/vo/sales/SalesOutboundVo.java b/src/main/java/com/ruoyi/account/bean/vo/sales/SalesOutboundVo.java
index 66d364f..13c1b27 100644
--- a/src/main/java/com/ruoyi/account/bean/vo/sales/SalesOutboundVo.java
+++ b/src/main/java/com/ruoyi/account/bean/vo/sales/SalesOutboundVo.java
@@ -1,6 +1,5 @@
 package com.ruoyi.account.bean.vo.sales;
 
-import com.alibaba.excel.annotation.ExcelIgnore;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ruoyi.framework.aspectj.lang.annotation.Excel;
@@ -53,8 +52,4 @@
     @Schema(description = "閿�鍞鍗曞彿")
     @Excel(name = "閿�鍞鍗曞彿")
     private String salesContractNo;
-
-    @Schema(description = "宸叉敹娆鹃噾棰�")
-    @ExcelIgnore
-    private BigDecimal amountReceived;
 }
diff --git a/src/main/java/com/ruoyi/account/bean/vo/sales/SalesReturnVo.java b/src/main/java/com/ruoyi/account/bean/vo/sales/SalesReturnVo.java
index 36f65c4..980d7f8 100644
--- a/src/main/java/com/ruoyi/account/bean/vo/sales/SalesReturnVo.java
+++ b/src/main/java/com/ruoyi/account/bean/vo/sales/SalesReturnVo.java
@@ -29,22 +29,6 @@
     @Excel(name = "鍏宠仈鍙戣揣鍗曞彿")
     private String shippingNo;
 
-    @Schema(description = "鍙戣揣绫诲瀷")
-    @Excel(name = "鍙戣揣绫诲瀷")
-    private Integer shippingType;
-
-    @Schema(description = "鍙戣揣杞︾墝鍙�")
-    @Excel(name = "鍙戣揣杞︾墝鍙�")
-    private String truckPlateNo;
-
-    @Schema(description = "蹇�掑叕鍙�")
-    @Excel(name = "蹇�掑叕鍙�")
-    private String expressCompany;
-
-    @Schema(description = "蹇�掑崟鍙�")
-    @Excel(name = "蹇�掑崟鍙�")
-    private String expressNo;
-
     @Schema(description = "閫�璐ф棩鏈�")
     @Excel(name = "閫�璐ф棩鏈�")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
diff --git a/src/main/java/com/ruoyi/account/controller/sales/AccountInvoiceApplicationController.java b/src/main/java/com/ruoyi/account/controller/sales/AccountInvoiceApplicationController.java
index 699f57c..00b490f 100644
--- a/src/main/java/com/ruoyi/account/controller/sales/AccountInvoiceApplicationController.java
+++ b/src/main/java/com/ruoyi/account/controller/sales/AccountInvoiceApplicationController.java
@@ -16,7 +16,6 @@
 import org.springframework.web.bind.annotation.*;
 
 import java.util.Arrays;
-import java.util.List;
 
 /**
  * <p>
@@ -40,13 +39,6 @@
     public R<IPage<AccountInvoiceApplicationVo>> listPageAccountInvoiceApplication(Page page, AccountInvoiceApplicationDto accountInvoiceApplicationDto) {
         IPage<AccountInvoiceApplicationVo> listPage = accountInvoiceApplicationService.listPageAccountInvoiceApplication(page,accountInvoiceApplicationDto);
         return R.ok(listPage);
-    }
-
-    @GetMapping("/getAccountInvoiceApplicationList")
-    @Log(title = "鏍规嵁瀹㈡埛id鏌ヨ寮�绁ㄧ敵璇峰彴璐�", businessType = BusinessType.OTHER)
-    @Operation(summary = "璐㈠姟绠$悊--寮�绁ㄧ敵璇峰彴璐�")
-    public R<List<AccountInvoiceApplicationVo>> getAccountInvoiceApplicationList(@RequestParam Integer customerId){
-        return R.ok(accountInvoiceApplicationService.getAccountInvoiceApplicationList(customerId));
     }
 
     @GetMapping("/getOutboundBatchesByCustomer")
diff --git a/src/main/java/com/ruoyi/account/mapper/sales/AccountInvoiceApplicationMapper.java b/src/main/java/com/ruoyi/account/mapper/sales/AccountInvoiceApplicationMapper.java
index c37a31f..463f178 100644
--- a/src/main/java/com/ruoyi/account/mapper/sales/AccountInvoiceApplicationMapper.java
+++ b/src/main/java/com/ruoyi/account/mapper/sales/AccountInvoiceApplicationMapper.java
@@ -29,6 +29,4 @@
 
     //鍒ゆ柇璇ュ嚭搴撹褰曟槸鍚︽湁寮�绁ㄧ敵璇�
     boolean existsByStockOutRecordId(@Param("stockOutRecordIds") List<Long> stockOutRecordIds);
-
-    List<AccountInvoiceApplicationVo> selectAccountInvoiceApplicationList(@Param("customerId") Integer customerId);
 }
diff --git a/src/main/java/com/ruoyi/account/service/impl/financial/AccountSubjectServiceImpl.java b/src/main/java/com/ruoyi/account/service/impl/financial/AccountSubjectServiceImpl.java
index aa0c858..a6c4149 100644
--- a/src/main/java/com/ruoyi/account/service/impl/financial/AccountSubjectServiceImpl.java
+++ b/src/main/java/com/ruoyi/account/service/impl/financial/AccountSubjectServiceImpl.java
@@ -174,7 +174,7 @@
         if (accountSubjectDto != null && accountSubjectDto.getStatus() != null) {
             queryWrapper.eq(AccountSubject::getStatus, accountSubjectDto.getStatus());
         }
-        queryWrapper.orderByDesc(AccountSubject::getSubjectCode).orderByDesc(AccountSubject::getId);
+        queryWrapper.orderByAsc(AccountSubject::getSubjectCode).orderByAsc(AccountSubject::getId);
         return queryWrapper;
     }
 
@@ -296,8 +296,8 @@
         }
         List<AccountSubject> sortedSubjects = new ArrayList<>(subjects);
         sortedSubjects.sort(Comparator
-                .comparing(AccountSubject::getSubjectCode, Comparator.nullsFirst(String::compareTo)).reversed()
-                .thenComparing(AccountSubject::getId, Comparator.nullsFirst(Long::compareTo)).reversed());
+                .comparing(AccountSubject::getSubjectCode, Comparator.nullsLast(String::compareTo))
+                .thenComparing(AccountSubject::getId, Comparator.nullsLast(Long::compareTo)));
 
         Map<Long, AccountSubjectVo> subjectVoMap = new LinkedHashMap<>();
         for (AccountSubject subject : sortedSubjects) {
diff --git a/src/main/java/com/ruoyi/account/service/impl/sales/AccountInvoiceApplicationServiceImpl.java b/src/main/java/com/ruoyi/account/service/impl/sales/AccountInvoiceApplicationServiceImpl.java
index c88ede2..74cec42 100644
--- a/src/main/java/com/ruoyi/account/service/impl/sales/AccountInvoiceApplicationServiceImpl.java
+++ b/src/main/java/com/ruoyi/account/service/impl/sales/AccountInvoiceApplicationServiceImpl.java
@@ -91,11 +91,6 @@
         return removeBatchByIds(ids);
     }
 
-    @Override
-    public List<AccountInvoiceApplicationVo> getAccountInvoiceApplicationList(Integer customerId) {
-        return accountInvoiceApplicationMapper.selectAccountInvoiceApplicationList(customerId);
-    }
-
     private String genInvoiceApplicationNo() {
         return "KP" + LocalDateTime.now().format(CODE_TIME_FORMATTER) + new Random().nextInt(10);
     }
diff --git a/src/main/java/com/ruoyi/account/service/impl/sales/AccountSalesCollectionServiceImpl.java b/src/main/java/com/ruoyi/account/service/impl/sales/AccountSalesCollectionServiceImpl.java
index 45900d7..5f328bc 100644
--- a/src/main/java/com/ruoyi/account/service/impl/sales/AccountSalesCollectionServiceImpl.java
+++ b/src/main/java/com/ruoyi/account/service/impl/sales/AccountSalesCollectionServiceImpl.java
@@ -53,15 +53,15 @@
         if (StringUtils.isEmpty(accountSalesCollection.getCollectionNumber())) {
             accountSalesCollection.setCollectionNumber(genAccountSalesCollectionNo());
         }
-//        String stockOutRecordIds = accountSalesCollection.getStockOutRecordIds();
-//        if (stockOutRecordIds != null && !stockOutRecordIds.isEmpty()) {
-//            List<Long> ids = Arrays.stream(stockOutRecordIds.split(","))
-//                    .map(Long::valueOf)
-//                    .toList();
-//            if (accountSalesCollectionMapper.existsByStockOutRecordId(ids)){
-//                throw new ServiceException("瀛樺湪閲嶅鐨勫嚭搴撳崟");
-//            }
-//        }
+        String stockOutRecordIds = accountSalesCollection.getStockOutRecordIds();
+        if (stockOutRecordIds != null && !stockOutRecordIds.isEmpty()) {
+            List<Long> ids = Arrays.stream(stockOutRecordIds.split(","))
+                    .map(Long::valueOf)
+                    .toList();
+            if (accountSalesCollectionMapper.existsByStockOutRecordId(ids)){
+                throw new ServiceException("瀛樺湪閲嶅鐨勫嚭搴撳崟");
+            }
+        }
         return save(accountSalesCollection);
     }
 
diff --git a/src/main/java/com/ruoyi/account/service/sales/AccountInvoiceApplicationService.java b/src/main/java/com/ruoyi/account/service/sales/AccountInvoiceApplicationService.java
index d2cefc1..7f55ba5 100644
--- a/src/main/java/com/ruoyi/account/service/sales/AccountInvoiceApplicationService.java
+++ b/src/main/java/com/ruoyi/account/service/sales/AccountInvoiceApplicationService.java
@@ -30,6 +30,4 @@
     void exportAccountInvoiceApplication(HttpServletResponse response, AccountInvoiceApplicationDto accountInvoiceApplicationDto);
 
     boolean deleteAccountInvoiceApplication(List<Long> ids);
-
-    List<AccountInvoiceApplicationVo> getAccountInvoiceApplicationList(Integer customerId);
 }
diff --git a/src/main/java/com/ruoyi/aftersalesservice/dto/AfterSalesServiceExeclDto.java b/src/main/java/com/ruoyi/aftersalesservice/dto/AfterSalesServiceExeclDto.java
index 472ffcd..4780b29 100644
--- a/src/main/java/com/ruoyi/aftersalesservice/dto/AfterSalesServiceExeclDto.java
+++ b/src/main/java/com/ruoyi/aftersalesservice/dto/AfterSalesServiceExeclDto.java
@@ -62,4 +62,12 @@
     @Excel(name = "鍏宠仈閮ㄩ棬")
     private String deptName;
 
+    @Schema(description = "璇勫垎")
+    @Excel(name = "璇勫垎")
+    private String rating;
+
+    @Schema(description = "璇勪环鍐呭鎻忚堪")
+    @Excel(name = "璇勪环鍐呭鎻忚堪")
+    private String evaluation;
+
 }
diff --git a/src/main/java/com/ruoyi/aftersalesservice/pojo/AfterSalesService.java b/src/main/java/com/ruoyi/aftersalesservice/pojo/AfterSalesService.java
index e3b509f..4b53fba 100644
--- a/src/main/java/com/ruoyi/aftersalesservice/pojo/AfterSalesService.java
+++ b/src/main/java/com/ruoyi/aftersalesservice/pojo/AfterSalesService.java
@@ -115,6 +115,7 @@
     /**
      * 鍒涘缓鏃堕棿
      */
+    @TableField(fill = FieldFill.INSERT)
     private LocalDateTime createTime;
 
     /**
@@ -156,8 +157,16 @@
     @Schema(description = "浜у搧鍨嬪彿IDs")
     private String productModelIds;
 
+    @Schema(description = "浜у搧鍨嬪彿鏁伴噺,閫楀彿鍒嗛殧")
+    private String productModelQuantities;
 
+    @Schema(description = "璇勫垎(1-5鍒�)")
+    @Excel(name = "璇勫垎")
+    private BigDecimal rating;
 
+    @Schema(description = "璇勪环鍐呭鎻忚堪")
+    @Excel(name = "璇勪环鍐呭鎻忚堪")
+    private String evaluation;
 
     @TableField(fill = FieldFill.INSERT)
     private Long deptId;
diff --git a/src/main/java/com/ruoyi/aftersalesservice/service/impl/AfterSalesServiceServiceImpl.java b/src/main/java/com/ruoyi/aftersalesservice/service/impl/AfterSalesServiceServiceImpl.java
index 49e7ae3..0feab41 100644
--- a/src/main/java/com/ruoyi/aftersalesservice/service/impl/AfterSalesServiceServiceImpl.java
+++ b/src/main/java/com/ruoyi/aftersalesservice/service/impl/AfterSalesServiceServiceImpl.java
@@ -11,8 +11,6 @@
 import com.ruoyi.aftersalesservice.service.AfterSalesServiceService;
 import com.ruoyi.common.utils.OrderUtils;
 import com.ruoyi.common.utils.SecurityUtils;
-
-import java.time.LocalDateTime;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.project.system.domain.SysDept;
 import com.ruoyi.project.system.domain.SysUser;
@@ -46,6 +44,7 @@
     private final SysUserMapper sysUserMapper;
     private final ISalesLedgerProductService salesLedgerProductService;
     private final ISalesLedgerService salesLedgerService;
+    private final com.ruoyi.sales.mapper.ShippingInfoMapper shippingInfoMapper;
 
     @Override
     public IPage<AfterSalesServiceNewDto> listPage(Page page, AfterSalesServiceNewDto afterSalesService) {
@@ -71,7 +70,7 @@
         if(sysUser == null) throw new RuntimeException("瀹℃牳浜轰笉瀛樺湪");
         afterSalesServiceNewDto.setCheckNickName(sysUser.getNickName());
         if (StringUtils.isEmpty(afterSalesServiceNewDto.getAfterSalesServiceNo())) {
-            String string = OrderUtils.countAfterServiceTodayByCreateTime(afterSalesServiceMapper, "SH_", afterSalesServiceNewDto.getCreateTime() != null ? afterSalesServiceNewDto.getCreateTime() : LocalDateTime.now());
+            String string = OrderUtils.countAfterServiceTodayByCreateTime(afterSalesServiceMapper, "SH_");
             afterSalesServiceNewDto.setAfterSalesServiceNo(string);
         }
         return this.save(afterSalesServiceNewDto);
@@ -83,6 +82,38 @@
         SalesLedger byId = salesLedgerService.getById(afterSalesService.getSalesLedgerId());
         List<Long> collect = Arrays.stream(afterSalesService.getProductModelIds().split(",")).map(Long::valueOf).collect(Collectors.toList());
         List<SalesLedgerProduct> list = salesLedgerProductService.list(new QueryWrapper<SalesLedgerProduct>().lambda().in(SalesLedgerProduct::getId, collect));
+
+        if (StringUtils.isNotEmpty(afterSalesService.getProductModelQuantities())) {
+            String[] quantities = afterSalesService.getProductModelQuantities().split(",");
+            for (int i = 0; i < collect.size(); i++) {
+                Long productId = collect.get(i);
+                for (SalesLedgerProduct product : list) {
+                    if (product.getId().equals(productId)) {
+                        if (i < quantities.length && StringUtils.isNotEmpty(quantities[i])) {
+                            product.setQuantity(new java.math.BigDecimal(quantities[i]));
+                        }
+                        break;
+                    }
+                }
+            }
+        }
+
+        for (SalesLedgerProduct product : list) {
+            com.ruoyi.sales.pojo.ShippingInfo shippingInfo = shippingInfoMapper.selectOne(
+                new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<com.ruoyi.sales.pojo.ShippingInfo>()
+                    .eq(com.ruoyi.sales.pojo.ShippingInfo::getSalesLedgerProductId, product.getId())
+                    .orderByDesc(com.ruoyi.sales.pojo.ShippingInfo::getCreateTime)
+                    .last("limit 1")
+            );
+            if (shippingInfo != null) {
+                product.setShippingCarNumber(shippingInfo.getShippingCarNumber());
+                product.setShippingDate(shippingInfo.getShippingDate());
+                product.setShippingStatus(shippingInfo.getStatus());
+                product.setExpressCompany(shippingInfo.getExpressCompany());
+                product.setExpressNumber(shippingInfo.getExpressNumber());
+            }
+        }
+
         AfterSalesServiceNewDto afterSalesServiceNewDto = new AfterSalesServiceNewDto();
         BeanUtils.copyProperties(afterSalesService, afterSalesServiceNewDto);
         SalesLedgerDto salesLedgerDto = new SalesLedgerDto();
diff --git a/src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java b/src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java
index d0af196..80d6bd8 100644
--- a/src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java
+++ b/src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java
@@ -2,6 +2,8 @@
 
 import com.ruoyi.approve.pojo.ApproveNode;
 import com.ruoyi.approve.service.IApproveNodeService;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
@@ -35,6 +37,7 @@
      * @param approveNode
      * @return
      */
+    @Log(title = "瀹℃壒鑺傜偣", businessType = BusinessType.UPDATE)
     @PostMapping("/updateApproveNode")
     @Transactional(rollbackFor = Exception.class)
     @Operation(summary = "瀹℃壒鑺傜偣")
@@ -48,6 +51,7 @@
      * @param id
      * @return
      */
+    @Log(title = "鍒濆鍖栧鎵硅妭鐐�", businessType = BusinessType.INSERT)
     @PostMapping("/init")
     public AjaxResult init(String id) {
         approveNodeService.initApproveNodes("",id,1L);
diff --git a/src/main/java/com/ruoyi/approve/controller/ApproveProcessConfigNodeController.java b/src/main/java/com/ruoyi/approve/controller/ApproveProcessConfigNodeController.java
index b837af6..939aa38 100644
--- a/src/main/java/com/ruoyi/approve/controller/ApproveProcessConfigNodeController.java
+++ b/src/main/java/com/ruoyi/approve/controller/ApproveProcessConfigNodeController.java
@@ -2,6 +2,8 @@
 
 import com.ruoyi.approve.pojo.ApproveProcessConfigNode;
 import com.ruoyi.approve.service.ApproveProcessConfigNodeService;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
@@ -41,6 +43,7 @@
      * @return
      */
     @ApiOperation("娣诲姞瀹℃壒鑺傜偣")
+    @Log(title = "瀹℃壒娴佺▼鑺傜偣", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public R addApproveProcessConfigNodes(@RequestBody List<ApproveProcessConfigNode> approveProcessConfigNodes) {
         return R.ok(approveProcessConfigNodeService.addApproveProcessConfigNodes(approveProcessConfigNodes));
diff --git a/src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java b/src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java
index ed02564..3b44724 100644
--- a/src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java
+++ b/src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java
@@ -8,6 +8,8 @@
 import com.ruoyi.approve.bean.vo.ApproveProcessVO;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.security.LoginUser;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.project.system.domain.SysDept;
@@ -47,6 +49,7 @@
      * @param approveProcessVO
      * @return
      */
+    @Log(title = "娣诲姞瀹℃壒", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     @Transactional(rollbackFor = Exception.class)
     @Operation(summary = "娣诲姞瀹℃壒")
@@ -78,6 +81,7 @@
      * @param approveGetAndUpdateVo
      * @return
      */
+    @Log(title = "鏇存柊瀹℃壒", businessType = BusinessType.UPDATE)
     @PostMapping("/update")
     @Transactional(rollbackFor = Exception.class)
     @Operation(summary = "鏇存柊瀹℃壒")
@@ -103,6 +107,7 @@
      * @param ids
      * @return
      */
+    @Log(title = "鍒犻櫎瀹℃壒", businessType = BusinessType.DELETE)
     @DeleteMapping("/deleteIds")
     @Operation(summary = "鍒犻櫎瀹℃壒")
     @Transactional(rollbackFor = Exception.class)
@@ -115,6 +120,7 @@
     }
 
     @Operation(summary = "鍏嚭绠$悊瀵煎嚭")
+    @Log(title = "鍏嚭绠$悊瀵煎嚭", businessType = BusinessType.EXPORT)
     @PostMapping("/exportOne")
     public void exportOne(HttpServletResponse response) {
         List<ApproveProcess> accountExpenses = approveProcessService.list(new LambdaQueryWrapper<ApproveProcess>()
@@ -125,6 +131,7 @@
     }
 
     @Operation(summary = "璇峰亣绠$悊瀵煎嚭")
+    @Log(title = "璇峰亣绠$悊瀵煎嚭", businessType = BusinessType.EXPORT)
     @PostMapping("/exportTwo")
     public void exportTwo(HttpServletResponse response) {
         List<ApproveProcess> accountExpenses = approveProcessService.list(new LambdaQueryWrapper<ApproveProcess>()
@@ -135,6 +142,7 @@
     }
 
     @Operation(summary = "鍑哄樊绠$悊瀵煎嚭")
+    @Log(title = "鍑哄樊绠$悊瀵煎嚭", businessType = BusinessType.EXPORT)
     @PostMapping("/exportThree")
     public void exportThree(HttpServletResponse response) {
         List<ApproveProcess> accountExpenses = approveProcessService.list(new LambdaQueryWrapper<ApproveProcess>()
@@ -145,6 +153,7 @@
     }
 
     @Operation(summary = "鎶ラ攢绠$悊瀵煎嚭")
+    @Log(title = "鎶ラ攢绠$悊瀵煎嚭", businessType = BusinessType.EXPORT)
     @PostMapping("/exportFour")
     public void exportFour(HttpServletResponse response) {
         List<ApproveProcess> accountExpenses = approveProcessService.list(new LambdaQueryWrapper<ApproveProcess>()
@@ -155,6 +164,7 @@
     }
 
     @Operation(summary = "閲囪喘鐢宠瀵煎嚭")
+    @Log(title = "閲囪喘鐢宠瀵煎嚭", businessType = BusinessType.EXPORT)
     @PostMapping("/exportFive")
     public void exportFive(HttpServletResponse response) {
         List<ApproveProcess> accountExpenses = approveProcessService.list(new LambdaQueryWrapper<ApproveProcess>()
@@ -165,6 +175,7 @@
     }
 
     @Operation(summary = "鍗忓悓瀹℃壒瀵煎嚭")
+    @Log(title = "鍗忓悓瀹℃壒瀵煎嚭", businessType = BusinessType.EXPORT)
     @PostMapping("/exportZero")
     public void exportZero(HttpServletResponse response) {
         List<ApproveProcess> accountExpenses = approveProcessService.list(new LambdaQueryWrapper<ApproveProcess>()
@@ -175,6 +186,7 @@
     }
 
     @Operation(summary = "鍗遍櫓浣滀笟瀹℃壒瀵煎嚭")
+    @Log(title = "鍗遍櫓浣滀笟瀹℃壒瀵煎嚭", businessType = BusinessType.EXPORT)
     @PostMapping("/exportEight")
     public void exportEight(HttpServletResponse response) {
         List<ApproveProcess> accountExpenses = approveProcessService.list(new LambdaQueryWrapper<ApproveProcess>()
diff --git a/src/main/java/com/ruoyi/approve/controller/HolidaySettingsController.java b/src/main/java/com/ruoyi/approve/controller/HolidaySettingsController.java
index 97abe9f..e561984 100644
--- a/src/main/java/com/ruoyi/approve/controller/HolidaySettingsController.java
+++ b/src/main/java/com/ruoyi/approve/controller/HolidaySettingsController.java
@@ -7,6 +7,8 @@
 import com.ruoyi.approve.mapper.WorkingHoursSettingMapper;
 import com.ruoyi.approve.pojo.*;
 import com.ruoyi.approve.service.HolidaySettingsService;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import lombok.AllArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -37,6 +39,7 @@
      * 澧炴坊
      * @return
      */
+    @Log(title = "澧炴坊鍋囨湡璁剧疆", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public AjaxResult add(@RequestBody HolidaySettings holidaySettings){
         return AjaxResult.success(holidaySettingsService.save(holidaySettings));
@@ -45,6 +48,7 @@
      * 鏇存柊
      * @return
      */
+    @Log(title = "鏇存柊鍋囨湡璁剧疆", businessType = BusinessType.UPDATE)
     @PostMapping("/update")
     public AjaxResult update(@RequestBody HolidaySettings holidaySettings){
         return AjaxResult.success(holidaySettingsService.updateById(holidaySettings));
@@ -53,6 +57,7 @@
      * 鍒犻櫎
      * @return
      */
+    @Log(title = "鍒犻櫎鍋囨湡璁剧疆", businessType = BusinessType.DELETE)
     @DeleteMapping("/delete")
     public AjaxResult delete(@RequestBody List<Long> ids){
         if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
@@ -72,6 +77,7 @@
      * 澧炴坊骞村亣瑙勫垯
      * @return
      */
+    @Log(title = "澧炴坊骞村亣瑙勫垯", businessType = BusinessType.INSERT)
     @PostMapping("/addAnnualLeaveSetting")
     public AjaxResult addAnnualLeaveSetting(@RequestBody AnnualLeaveSetting annualLeaveSetting){
         return AjaxResult.success(annualLeaveSettingMapper.insert(annualLeaveSetting));
@@ -80,6 +86,7 @@
      * 鏇存柊骞村亣瑙勫垯
      * @return
      */
+    @Log(title = "鏇存柊骞村亣瑙勫垯", businessType = BusinessType.UPDATE)
     @PostMapping("/updateAnnualLeaveSetting")
     public AjaxResult updateAnnualLeaveSetting(@RequestBody AnnualLeaveSetting annualLeaveSetting){
         return AjaxResult.success(annualLeaveSettingMapper.updateById(annualLeaveSetting));
@@ -88,6 +95,7 @@
      * 鍒犻櫎骞村亣瑙勫垯
      * @return
      */
+    @Log(title = "鍒犻櫎骞村亣瑙勫垯", businessType = BusinessType.DELETE)
     @DeleteMapping("/deleteAnnualLeaveSetting")
     public AjaxResult deleteAnnualLeaveSetting(@RequestBody List<Long> ids){
         if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
@@ -108,6 +116,7 @@
      * 澧炴坊鍔犵彮瑙勫垯
      * @return
      */
+    @Log(title = "澧炴坊鍔犵彮瑙勫垯", businessType = BusinessType.INSERT)
     @PostMapping("/addOvertimeSetting")
     public AjaxResult addOvertimeSetting(@RequestBody OvertimeSetting overtimeSetting){
         return AjaxResult.success(overtimeSettingMapper.insert(overtimeSetting));
@@ -116,6 +125,7 @@
      * 鏇存柊鍔犵彮瑙勫垯
      * @return
      */
+    @Log(title = "鏇存柊鍔犵彮瑙勫垯", businessType = BusinessType.UPDATE)
     @PostMapping("/updateOvertimeSetting")
     public AjaxResult updateOvertimeSetting(@RequestBody OvertimeSetting overtimeSetting){
         return AjaxResult.success(overtimeSettingMapper.updateById(overtimeSetting));
@@ -124,6 +134,7 @@
      * 鍒犻櫎鍔犵彮瑙勫垯
      * @return
      */
+    @Log(title = "鍒犻櫎鍔犵彮瑙勫垯", businessType = BusinessType.DELETE)
     @DeleteMapping("/deleteOvertimeSetting")
     public AjaxResult deleteOvertimeSetting(@RequestBody List<Long> ids){
         if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
@@ -143,6 +154,7 @@
      * 澧炴坊鐝埗瑙勫垯
      * @return
      */
+    @Log(title = "澧炴坊鐝埗瑙勫垯", businessType = BusinessType.INSERT)
     @PostMapping("/addWorkingHoursSetting")
     public AjaxResult addWorkingHoursSetting(@RequestBody WorkingHoursSetting workingHoursSetting){
         return AjaxResult.success(workingHoursSettingMapper.insert(workingHoursSetting));
@@ -151,6 +163,7 @@
      * 鏇存柊鐝埗瑙勫垯
      * @return
      */
+    @Log(title = "鏇存柊鐝埗瑙勫垯", businessType = BusinessType.UPDATE)
     @PostMapping("/updateWorkingHoursSetting")
     public AjaxResult updateWorkingHoursSetting(@RequestBody WorkingHoursSetting workingHoursSetting){
         return AjaxResult.success(workingHoursSettingMapper.updateById(workingHoursSetting));
@@ -159,6 +172,7 @@
      * 鍒犻櫎鐝埗瑙勫垯
      * @return
      */
+    @Log(title = "鍒犻櫎鐝埗瑙勫垯", businessType = BusinessType.DELETE)
     @DeleteMapping("/deleteWorkingHoursSetting")
     public AjaxResult deleteWorkingHoursSetting(@RequestBody List<Long> ids){
         if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
diff --git a/src/main/java/com/ruoyi/approve/controller/KnowledgeBaseController.java b/src/main/java/com/ruoyi/approve/controller/KnowledgeBaseController.java
index ba93fb4..4bbb84b 100644
--- a/src/main/java/com/ruoyi/approve/controller/KnowledgeBaseController.java
+++ b/src/main/java/com/ruoyi/approve/controller/KnowledgeBaseController.java
@@ -2,25 +2,18 @@
 
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.approve.dto.KnowledgeBaseVectorVO;
 import com.ruoyi.approve.pojo.KnowledgeBase;
-import com.ruoyi.approve.pojo.KnowledgeBaseVector;
 import com.ruoyi.approve.service.KnowledgeBaseService;
-import com.ruoyi.approve.service.KnowledgeBaseVectorService;
-import com.ruoyi.basic.dto.StorageAttachmentDTO;
-import com.ruoyi.basic.dto.StorageBlobDTO;
-import com.ruoyi.basic.pojo.StorageBlob;
-import com.ruoyi.basic.service.StorageAttachmentService;
-import com.ruoyi.basic.service.StorageBlobService;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
-import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.AllArgsConstructor;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.ArrayList;
 import java.util.List;
 
 @RestController
@@ -29,45 +22,47 @@
 @Tag(name = "鐭ヨ瘑搴撶鐞�")
 public class KnowledgeBaseController {
     private KnowledgeBaseService knowledgeBaseService;
-    private KnowledgeBaseVectorService knowledgeBaseVectorService;
-    private StorageAttachmentService storageAttachmentService;
-    private StorageBlobService storageBlobService;
 
-    /**
+    /**銆�
      * 鑾峰彇鍒楄〃
+     * @return
      */
     @GetMapping("/getList")
     public AjaxResult getList(@RequestParam(defaultValue = "1") long current,
                               @RequestParam(defaultValue = "10") long size, KnowledgeBase knowledgeBase) {
         Page page = new Page(current, size);
-        return AjaxResult.success(knowledgeBaseService.listpage(page, knowledgeBase));
+        return AjaxResult.success(knowledgeBaseService.listpage(page,knowledgeBase));
     }
-
-    /**
-     * 鏂板鐭ヨ瘑搴�
+    /**銆�
+     * 澧炴坊
+     * @return
      */
+    @Log(title = "鐭ヨ瘑搴�", businessType = BusinessType.INSERT)
     @PostMapping("/add")
-    public AjaxResult add(@RequestBody KnowledgeBase knowledgeBase) {
+    public AjaxResult add(@RequestBody KnowledgeBase knowledgeBase){
         return AjaxResult.success(knowledgeBaseService.save(knowledgeBase));
     }
-
     /**
-     * 鏇存柊鐭ヨ瘑搴�
+     * 鏇存柊
+     * @return
      */
+    @Log(title = "鐭ヨ瘑搴�", businessType = BusinessType.UPDATE)
     @PostMapping("/update")
-    public AjaxResult update(@RequestBody KnowledgeBase knowledgeBase) {
+    public AjaxResult update(@RequestBody KnowledgeBase knowledgeBase){
         return AjaxResult.success(knowledgeBaseService.updateById(knowledgeBase));
     }
-
     /**
-     * 鍒犻櫎鐭ヨ瘑搴�
+     * 鍒犻櫎
+     * @return
      */
+    @Log(title = "鐭ヨ瘑搴�", businessType = BusinessType.DELETE)
     @DeleteMapping("/delete")
-    public AjaxResult delete(@RequestBody List<Long> ids) {
-        if (CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+    public AjaxResult delete(@RequestBody List<Long> ids){
+        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
         return AjaxResult.success(knowledgeBaseService.removeByIds(ids));
     }
 
+    @Log(title = "鐭ヨ瘑搴�", businessType = BusinessType.EXPORT)
     @Operation(summary = "鐭ヨ瘑搴撶鐞嗗鍑�")
     @PostMapping("/export")
     public void export(HttpServletResponse response) {
@@ -76,101 +71,4 @@
         util.exportExcel(response, accountExpenses, "鐭ヨ瘑搴撶鐞嗗鍑�");
     }
 
-    /**
-     * 鏌ヨ鐭ヨ瘑搴撴枃浠跺悜閲忓寲鐘舵��
-     */
-    @GetMapping("/vector/status/{knowledgeBaseId}")
-    @Operation(summary = "鏌ヨ鐭ヨ瘑搴撴枃浠跺悜閲忓寲鐘舵��")
-    public AjaxResult getVectorStatus(@PathVariable Long knowledgeBaseId) {
-        List<KnowledgeBaseVectorVO> list = knowledgeBaseVectorService.getVectorStatusByKnowledgeBaseId(knowledgeBaseId);
-        return AjaxResult.success(list);
-    }
-
-    /**
-     * 閲嶆柊鍚戦噺鍖栨枃浠�
-     */
-    @PostMapping("/vector/reprocess/{vectorId}")
-    @Operation(summary = "閲嶆柊鍚戦噺鍖栨枃浠�")
-    public AjaxResult reprocessVector(@PathVariable Long vectorId) {
-        knowledgeBaseVectorService.reprocessVector(vectorId);
-        return AjaxResult.success("宸查噸鏂版彁浜ゅ悜閲忓寲浠诲姟");
-    }
-
-    /**
-     * 淇濆瓨鐭ヨ瘑搴撴枃浠跺叧鑱旓紙鏂囦欢涓婁紶鍚庤皟鐢級
-     * 涓婁紶娴佺▼锛�
-     * 1. 鍏堣皟鐢� /common/upload 涓婁紶鏂囦欢锛岃幏鍙� storageBlobDTOs
-     * 2. 鍐嶈皟鐢ㄦ鎺ュ彛鍏宠仈鏂囦欢鍒扮煡璇嗗簱骞惰Е鍙戝悜閲忓寲
-     */
-    @PostMapping("/file/save")
-    @Operation(summary = "淇濆瓨鐭ヨ瘑搴撴枃浠跺叧鑱�")
-    public AjaxResult saveKnowledgeBaseFiles(@RequestBody KnowledgeBaseFileDTO dto) {
-        if (dto.getKnowledgeBaseId() == null) {
-            return AjaxResult.error("鐭ヨ瘑搴揑D涓嶈兘涓虹┖");
-        }
-        if (CollectionUtils.isEmpty(dto.getStorageBlobIds())) {
-            return AjaxResult.error("鏂囦欢ID涓嶈兘涓虹┖");
-        }
-
-        // 淇濆瓨闄勪欢鍏宠仈
-        StorageAttachmentDTO attachmentDTO = new StorageAttachmentDTO();
-        attachmentDTO.setRecordType("knowledge_base");
-        attachmentDTO.setRecordId(dto.getKnowledgeBaseId());
-        attachmentDTO.setApplication("rag_file");
-        List<StorageBlobDTO> blobDTOs = new ArrayList<>();
-        for (Long blobId : dto.getStorageBlobIds()) {
-            StorageBlobDTO blobDTO = new StorageBlobDTO();
-            blobDTO.setId(blobId);
-            blobDTOs.add(blobDTO);
-        }
-        attachmentDTO.setStorageBlobDTOs(blobDTOs);
-        storageAttachmentService.saveStorageAttachment(attachmentDTO);
-
-        // 鍒涘缓鍚戦噺璁板綍骞惰Е鍙戝悜閲忓寲
-        for (Long blobId : dto.getStorageBlobIds()) {
-            StorageBlob blob = storageBlobService.getById(blobId);
-            if (blob != null) {
-                String fileName = blob.getOriginalFilename();
-                String fileType = getFileExtension(fileName);
-
-                knowledgeBaseVectorService.createVectorRecord(
-                        dto.getKnowledgeBaseId(),
-                        blobId,
-                        fileName,
-                        fileType
-                );
-            }
-        }
-
-        return AjaxResult.success();
-    }
-
-    private String getFileExtension(String fileName) {
-        if (fileName == null || !fileName.contains(".")) {
-            return "unknown";
-        }
-        return fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();
-    }
-
-    /**
-     * 鍒犻櫎鐭ヨ瘑搴撴枃浠�
-     */
-    @DeleteMapping("/file/delete")
-    @Operation(summary = "鍒犻櫎鐭ヨ瘑搴撴枃浠�")
-    public AjaxResult deleteKnowledgeBaseFiles(@RequestBody List<Long> vectorIds) {
-        if (CollectionUtils.isEmpty(vectorIds)) {
-            return AjaxResult.error("璇烽�夋嫨瑕佸垹闄ょ殑鏂囦欢");
-        }
-        knowledgeBaseVectorService.deleteVectors(vectorIds);
-        return AjaxResult.success();
-    }
-
-    /**
-     * 鐭ヨ瘑搴撴枃浠禗TO
-     */
-    @lombok.Data
-    public static class KnowledgeBaseFileDTO {
-        private Long knowledgeBaseId;
-        private List<Long> storageBlobIds;
-    }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/ruoyi/approve/controller/NotificationManagementController.java b/src/main/java/com/ruoyi/approve/controller/NotificationManagementController.java
index a1796f8..97e8d8b 100644
--- a/src/main/java/com/ruoyi/approve/controller/NotificationManagementController.java
+++ b/src/main/java/com/ruoyi/approve/controller/NotificationManagementController.java
@@ -8,6 +8,8 @@
 import com.ruoyi.approve.pojo.NotificationManagement;
 import com.ruoyi.approve.pojo.OnlineMeeting;
 import com.ruoyi.approve.service.NotificationManagementService;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import lombok.AllArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -36,6 +38,7 @@
      * 澧炴坊
      * @return
      */
+    @Log(title = "澧炴坊閫氱煡绠$悊", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public AjaxResult add(@RequestBody NotificationManagement notificationManagement){
         return AjaxResult.success(notificationManagementService.save(notificationManagement));
@@ -44,6 +47,7 @@
      * 鏇存柊
      * @return
      */
+    @Log(title = "鏇存柊閫氱煡绠$悊", businessType = BusinessType.UPDATE)
     @PostMapping("/update")
     public AjaxResult update(@RequestBody NotificationManagement notificationManagement){
         return AjaxResult.success(notificationManagementService.updateById(notificationManagement));
@@ -52,6 +56,7 @@
      * 鍒犻櫎
      * @return
      */
+    @Log(title = "鍒犻櫎閫氱煡绠$悊", businessType = BusinessType.DELETE)
     @DeleteMapping("/delete")
     public AjaxResult delete(@RequestBody List<Long> ids){
         if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
@@ -62,6 +67,7 @@
      * @param onlineMeeting
      * @return
      */
+    @Log(title = "鏂板绾夸笂浼氳", businessType = BusinessType.INSERT)
     @PostMapping("/addOnlineMeeting")
     public AjaxResult addOnlineMeeting(@RequestBody OnlineMeeting onlineMeeting){
         return AjaxResult.success(onlineMeetingMapper.insert(onlineMeeting));
@@ -70,6 +76,7 @@
      *鏂板鏂囦欢鍏变韩
      *
      */
+    @Log(title = "鏂板鏂囦欢鍏变韩", businessType = BusinessType.INSERT)
     @PostMapping("/addFileSharing")
     public AjaxResult addFileSharing(@RequestBody FileSharing fileSharing){
         return AjaxResult.success(fileSharingMapper.insert(fileSharing));
diff --git a/src/main/java/com/ruoyi/approve/controller/RpaProcessAutomationController.java b/src/main/java/com/ruoyi/approve/controller/RpaProcessAutomationController.java
index 06a0f6d..7743769 100644
--- a/src/main/java/com/ruoyi/approve/controller/RpaProcessAutomationController.java
+++ b/src/main/java/com/ruoyi/approve/controller/RpaProcessAutomationController.java
@@ -5,6 +5,8 @@
 import com.ruoyi.approve.pojo.RpaProcessAutomation;
 import com.ruoyi.approve.service.RpaProcessAutomationService;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
@@ -34,6 +36,7 @@
      * 澧炴坊
      * @return
      */
+    @Log(title = "RPA娴佺▼鑷姩鍖�", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public AjaxResult add(@RequestBody RpaProcessAutomation rpaProcessAutomation){
         return AjaxResult.success(rpaProcessAutomationService.save(rpaProcessAutomation));
@@ -42,6 +45,7 @@
      * 鏇存柊
      * @return
      */
+    @Log(title = "RPA娴佺▼鑷姩鍖�", businessType = BusinessType.UPDATE)
     @PostMapping("/update")
     public AjaxResult update(@RequestBody RpaProcessAutomation rpaProcessAutomation){
         return AjaxResult.success(rpaProcessAutomationService.updateById(rpaProcessAutomation));
@@ -50,12 +54,14 @@
      * 鍒犻櫎
      * @return
      */
+    @Log(title = "RPA娴佺▼鑷姩鍖�", businessType = BusinessType.DELETE)
     @DeleteMapping("/delete")
     public AjaxResult delete(@RequestBody List<Long> ids){
         if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
         return AjaxResult.success(rpaProcessAutomationService.removeByIds(ids));
     }
 
+    @Log(title = "RPA娴佺▼鑷姩鍖�", businessType = BusinessType.EXPORT)
     @Operation(summary = "RPA娴佺▼鑷姩鍖栧鍑�")
     @PostMapping("/export")
     public void export(HttpServletResponse response) {
diff --git a/src/main/java/com/ruoyi/approve/pojo/KnowledgeBase.java b/src/main/java/com/ruoyi/approve/pojo/KnowledgeBase.java
index b15da7a..06dec8e 100644
--- a/src/main/java/com/ruoyi/approve/pojo/KnowledgeBase.java
+++ b/src/main/java/com/ruoyi/approve/pojo/KnowledgeBase.java
@@ -91,19 +91,4 @@
     @TableField(fill = FieldFill.INSERT)
     private Long deptId;
 
-    /**
-     * 鏂囦欢鏁伴噺
-     */
-    private Integer fileCount;
-
-    /**
-     * 鎬诲垏鐗囨暟閲�
-     */
-    private Integer totalChunkCount;
-
-    /**
-     * 鐭ヨ瘑搴撴弿杩�
-     */
-    private String description;
-
 }
diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
index 964be23..0962c54 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -1,6 +1,7 @@
 package com.ruoyi.approve.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -13,12 +14,26 @@
 import com.ruoyi.basic.enums.RecordTypeEnum;
 import com.ruoyi.basic.utils.FileUtil;
 import com.ruoyi.common.enums.FileNameType;
+import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.mapper.DeviceRepairMapper;
+import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.mapper.SysUserMapper;
 import com.ruoyi.project.system.service.ISysNoticeService;
-import com.ruoyi.sales.mapper.CommonFileMapper;
-import com.ruoyi.sales.pojo.CommonFile;
+import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
+import com.ruoyi.purchase.pojo.PurchaseLedger;
+import com.ruoyi.quality.mapper.QualityInspectMapper;
+import com.ruoyi.quality.mapper.QualityInspectParamMapper;
+import com.ruoyi.quality.mapper.QualityTestStandardMapper;
+import com.ruoyi.quality.mapper.QualityTestStandardParamMapper;
+import com.ruoyi.quality.pojo.QualityInspect;
+import com.ruoyi.quality.pojo.QualityInspectParam;
+import com.ruoyi.quality.pojo.QualityTestStandard;
+import com.ruoyi.quality.pojo.QualityTestStandardParam;
+import com.ruoyi.sales.mapper.*;
+import com.ruoyi.sales.pojo.*;
 import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
@@ -40,8 +55,18 @@
     private final SysUserMapper sysUserMapper;
     private final ISysNoticeService sysNoticeService;
     private final CommonFileMapper fileMapper;
+    private final DeviceRepairMapper deviceRepairMapper;
+    private final PurchaseLedgerMapper purchaseLedgerMapper;
+    private final SalesQuotationMapper salesQuotationMapper;
+    private final ShippingInfoMapper shippingInfoMapper;
+    private final ShippingProductDetailMapper shippingProductDetailMapper;
     private final CommonFileServiceImpl commonFileService;
-    private final ApproveBusinessStatusService approveBusinessStatusService;
+    private final StockUtils stockUtils;
+    private final SalesLedgerProductMapper salesLedgerProductMapper;
+    private final QualityInspectMapper qualityInspectMapper;
+    private final QualityTestStandardMapper qualityTestStandardMapper;
+    private final QualityTestStandardParamMapper qualityTestStandardParamMapper;
+    private final QualityInspectParamMapper qualityInspectParamMapper;
     private final FileUtil fileUtil;
 
 
@@ -137,7 +162,74 @@
         }
         approveProcessMapper.updateById(approveProcess);
 
-        approveBusinessStatusService.syncBusinessStatus(approveProcess.getApproveType(), approveProcess.getApproveReason(), status);
+        //閲囪喘瀹℃牳
+        if (approveProcess.getApproveType().equals(5)) {
+            PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectOne(new LambdaQueryWrapper<PurchaseLedger>()
+                    .eq(PurchaseLedger::getPurchaseContractNumber, approveProcess.getApproveReason())
+                    .last("limit 1"));
+            if (purchaseLedger != null) {
+                if (status.equals(2)) {
+                    // 鍚屾剰
+                    purchaseLedger.setApprovalStatus(3);
+                    List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new QueryWrapper<SalesLedgerProduct>()
+                            .lambda().eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedger.getId()).eq(SalesLedgerProduct::getType, 2));
+                    for (SalesLedgerProduct salesLedgerProduct : salesLedgerProducts) {
+                        // 璐ㄦ
+                        if (salesLedgerProduct.getIsChecked()) {
+                            addQualityInspect(purchaseLedger, salesLedgerProduct);
+                        } else {
+                            //鐩存帴鍏ュ簱
+                            stockUtils.addStockWithBatchNo(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId(), purchaseLedger.getPurchaseContractNumber() + "-" + salesLedgerProduct.getId());
+                        }
+                    }
+                } else if (status.equals(3)) {
+                    // 鎷掔粷
+                    purchaseLedger.setApprovalStatus(4);
+                } else if (status.equals(1)) {
+                    // 瀹℃牳涓�
+                    purchaseLedger.setApprovalStatus(2);
+                }
+                purchaseLedgerMapper.updateById(purchaseLedger);
+            }
+        }
+        // 閿�鍞姤浠风姸鎬佷慨鏀�
+        if (approveProcess.getApproveType().equals(6)) {
+            SalesQuotation salesQuote = salesQuotationMapper.selectOne(new LambdaQueryWrapper<SalesQuotation>()
+                    .eq(SalesQuotation::getQuotationNo, approveProcess.getApproveReason())
+                    .last("limit 1"));
+            // 鍚屾剰
+            if (status.equals(2) && salesQuote != null) {
+                salesQuote.setStatus("閫氳繃");
+            } else if (status.equals(3) && salesQuote != null) {
+                salesQuote.setStatus("鎷掔粷");
+            } else if (status.equals(1) && salesQuote != null) {
+                salesQuote.setStatus("瀹℃牳涓�");
+            }
+            salesQuotationMapper.updateById(salesQuote);
+        }
+        // 鍑哄簱瀹℃壒淇敼=鍙戣揣瀹℃壒
+        if (approveProcess.getApproveType().equals(7)) {
+            ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>()
+                    .eq(ShippingInfo::getShippingNo, approveProcess.getApproveReason())
+                    .orderByDesc(ShippingInfo::getCreateTime)
+                    .last("limit 1"));
+            if (shippingInfo != null) {
+                if (status.equals(2)) {
+                    shippingInfo.setStatus("瀹℃牳閫氳繃");
+                    shippingInfo.setShippingDate(new Date());
+                    //鏇存敼鍑哄簱瀹℃牳鐘舵�侊紙寰呯‘璁ゆ敼鎴愬緟瀹℃牳锛�
+                    //stockUtils.shipmentStatus(StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), shippingInfo.getId());
+                } else if (status.equals(3)) {
+                    //鍒犻櫎鍘熸湰锛堝緟纭锛夌殑鍑哄簱瀹℃牳鐘舵��
+                    //stockUtils.deleteStockOutRecord(shippingInfo.getId(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode());
+                    //shippingInfo.setStatus("瀹℃牳鎷掔粷");
+                } else if (status.equals(1)) {
+                    //shippingInfo.setStatus("瀹℃牳涓�");
+                }
+                shippingInfoMapper.updateById(shippingInfo);
+            }
+
+        }
         fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.APPROVE_NODE, approveNode.getId(), approveNode.getStorageBlobDTOS());
     }
 
@@ -215,4 +307,32 @@
         return null;
     }
 
+    private void addQualityInspect(PurchaseLedger purchaseLedger, SalesLedgerProduct saleProduct) {
+        QualityInspect qualityInspect = new QualityInspect();
+        qualityInspect.setInspectType(0);
+        qualityInspect.setSupplier(purchaseLedger.getSupplierName());
+        qualityInspect.setPurchaseLedgerId(purchaseLedger.getId());
+        qualityInspect.setProductId(saleProduct.getProductId());
+        qualityInspect.setProductName(saleProduct.getProductCategory());
+        qualityInspect.setModel(saleProduct.getSpecificationModel());
+        qualityInspect.setProductModelId(saleProduct.getProductModelId());
+        qualityInspect.setUnit(saleProduct.getUnit());
+        qualityInspect.setQuantity(saleProduct.getQuantity());
+        qualityInspectMapper.insert(qualityInspect);
+        List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(saleProduct.getProductId(), 0, null);
+        if (qualityTestStandard.size() > 0) {
+            qualityInspect.setTestStandardId(qualityTestStandard.get(0).getId());
+            qualityInspectMapper.updateById(qualityInspect);
+            qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>lambdaQuery()
+                            .eq(QualityTestStandardParam::getTestStandardId, qualityTestStandard.get(0).getId()))
+                    .forEach(qualityTestStandardParam -> {
+                        QualityInspectParam param = new QualityInspectParam();
+                        com.ruoyi.common.utils.bean.BeanUtils.copyProperties(qualityTestStandardParam, param);
+                        param.setId(null);
+                        param.setInspectId(qualityInspect.getId());
+                        qualityInspectParamMapper.insert(param);
+                    });
+        }
+    }
+
 }
diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
index 41f71e8..c631021 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
@@ -1,6 +1,8 @@
 package com.ruoyi.approve.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -23,8 +25,11 @@
 import com.ruoyi.basic.enums.RecordTypeEnum;
 import com.ruoyi.basic.utils.FileUtil;
 import com.ruoyi.common.enums.FileNameType;
+import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
+import com.ruoyi.common.utils.AmountUtils;
 import com.ruoyi.common.utils.OrderUtils;
 import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.project.system.domain.SysDept;
 import com.ruoyi.project.system.domain.SysNotice;
 import com.ruoyi.project.system.domain.SysUser;
@@ -34,8 +39,10 @@
 import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
 import com.ruoyi.purchase.pojo.PurchaseLedger;
 import com.ruoyi.sales.mapper.CommonFileMapper;
+import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
 import com.ruoyi.sales.mapper.ShippingInfoMapper;
 import com.ruoyi.sales.pojo.CommonFile;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.pojo.ShippingInfo;
 import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
 import lombok.RequiredArgsConstructor;
@@ -47,12 +54,15 @@
 import java.io.IOException;
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
 @RequiredArgsConstructor
 public class ApproveProcessServiceImpl extends ServiceImpl<ApproveProcessMapper, ApproveProcess> implements IApproveProcessService {
+    private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyyMMdd");
+
     private final SysDeptMapper sysDeptMapper;
     private final IApproveNodeService approveNodeService;
     private final SysUserMapper sysUserMapper;
@@ -61,10 +71,11 @@
     private final CommonFileServiceImpl commonFileService;
     private final ISysNoticeService sysNoticeService;
     private final PurchaseLedgerMapper purchaseLedgerMapper;
+    private final SalesLedgerProductMapper salesLedgerProductMapper;
+    private final StockUtils stockUtils;
     private final ShippingInfoMapper shippingInfoMapper;
     private final ApproveNodeMapper approveNodeMapper;
     private final ApproveProcessConfigNodeService approveProcessConfigNodeService;
-    private final ApproveBusinessStatusService approveBusinessStatusService;
     private final FileUtil fileUtil;
     private final ApproveProcessConfigNodeMapper approveProcessConfigNodeMapper;
 
@@ -72,34 +83,63 @@
     public void addApprove(ApproveProcessVO approveProcessVO) throws Exception {
         SysUser sysUser = SecurityUtils.getLoginUser().getUser();
         SysDept sysDept = sysDeptMapper.selectDeptById(SecurityUtils.getLoginUser().getCurrentDeptId());
-        if (sysDept == null) throw new RuntimeException("閮ㄩ棬涓嶅瓨鍦�");
-        if (sysUser == null) throw new RuntimeException("鐢宠浜轰笉瀛樺湪");
-
-        List<ApproveProcessConfigNodeVo> list = Optional.ofNullable(approveProcessConfigNodeService.listNode(approveProcessVO.getApproveType()))
-                .orElse(Collections.emptyList());
+        List<ApproveProcessConfigNodeVo> list = approveProcessConfigNodeService.listNode(approveProcessVO.getApproveType());
         List<Long> nodeIds = list.stream()
                 .map(ApproveProcessConfigNodeVo::getApproverId)
                 .filter(Objects::nonNull)
                 .collect(Collectors.toList());
-
-        // 瀹℃壒閰嶇疆娌℃湁鏈夋晥瀹℃牳浜烘椂锛屼笉鏂板鍗忓悓瀹℃壒娴佺▼锛岀洿鎺ユ墽琛屼笟鍔″鏍搁�氳繃閫昏緫銆�
+        // 鏃犲鏍镐汉閫昏緫娣诲姞
         if (CollectionUtils.isEmpty(nodeIds)) {
-            approveBusinessStatusService.syncBusinessStatus(approveProcessVO.getApproveType(), approveProcessVO.getApproveReason(), 2);
+            autoPassPurchaseApproveIfNoApprover(approveProcessVO); // 閲囪喘鍗曟棤瀹℃牳浜洪�昏緫
             return;
         }
-
         List<SysUser> sysUsers = sysUserMapper.selectUserByIds(nodeIds);
         if (CollectionUtils.isEmpty(sysUsers)) throw new RuntimeException("瀹℃牳鐢ㄦ埛涓嶅瓨鍦�");
-
-        // 鏈夊鏍镐汉鏃讹紝鎸夋甯稿崗鍚屽鎵规祦绋嬪垱寤哄鎵逛富琛ㄣ�佸鎵硅妭鐐瑰苟閫氱煡棣栦釜瀹℃牳浜恒��
-        ApproveProcess approveProcess = buildApproveProcess(approveProcessVO, sysUser, sysDept, nodeIds, sysUsers, 0);
-        markResubmitted(approveProcessVO);
+        if (sysDept == null) throw new RuntimeException("閮ㄩ棬涓嶅瓨鍦�");
+        if (sysUser == null) throw new RuntimeException("鐢宠浜轰笉瀛樺湪");
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        ApproveProcess approveProcess = new ApproveProcess();
+        String no = OrderUtils.countTodayByCreateTime(approveProcessMapper, "", "approve_id");
+        approveProcess.setApproveId(no);
+        approveProcess.setApproveUser(sysUser.getUserId());
+        approveProcess.setApproveUserName(sysUser.getNickName());
+        approveProcess.setApproveDeptId(sysDept.getDeptId());
+        approveProcess.setApproveUserIds(nodeIds.stream().map(String::valueOf).collect(Collectors.joining(",")));
+        approveProcess.setApproveDeptName(sysDept.getDeptName());
+        approveProcess.setApproveUserNames(sysUsers.stream().map(SysUser::getNickName).collect(Collectors.joining(",")));
+        approveProcess.setApproveTime(StringUtils.isEmpty(approveProcessVO.getApproveTime()) ? new Date() : dateFormat.parse(approveProcessVO.getApproveTime()));
+        approveProcess.setApproveReason(approveProcessVO.getApproveReason());
+        approveProcess.setDeviceRepairId(approveProcessVO.getDeviceRepairId());
+        approveProcess.setMaintenancePrice(AmountUtils.scaleAmount(approveProcessVO.getMaintenancePrice()));
+        approveProcess.setPrice(AmountUtils.scaleAmount(approveProcessVO.getPrice()));
+        approveProcess.setStartDate(approveProcessVO.getStartDate());
+        approveProcess.setEndDate(approveProcessVO.getEndDate());
+        approveProcess.setStartDateTime(approveProcessVO.getStartDateTime());
+        approveProcess.setEndDateTime(approveProcessVO.getEndDateTime());
+        approveProcess.setApproveStatus(0);
+        approveProcess.setApproveDelete(0);
+        approveProcess.setApproveType(approveProcessVO.getApproveType());
+        approveProcess.setCreateTime(LocalDateTime.now());
+        approveProcess.setTenantId(approveProcessVO.getApproveDeptId());
+        approveProcess.setApproveUserCurrentId(nodeIds.get(0));
+        approveProcess.setApproveUserCurrentName(sysUsers
+                .stream()
+                .filter(SysUser -> SysUser.getUserId().equals(nodeIds.get(0)))
+                .collect(Collectors.toList())
+                .get(0)
+                .getNickName());
+        // 璁剧疆鐘舵�佷负閲嶆柊鎻愪氦
+        if (approveProcessVO.getId() != null) {
+            ApproveProcess approveProcess1 = approveProcessMapper.selectById(approveProcessVO.getId());
+            approveProcess1.setApproveStatus(4);
+            approveProcessMapper.updateById(approveProcess1);
+        }
         save(approveProcess);
         //鍒濆鍖栧鎵硅妭鐐�
         String nodeIdStr = nodeIds.stream()
                 .map(String::valueOf)
                 .collect(Collectors.joining(","));
-        approveNodeService.initApproveNodes(nodeIdStr, approveProcess.getApproveId(), approveProcessVO.getApproveDeptId());
+        approveNodeService.initApproveNodes(nodeIdStr, no, approveProcessVO.getApproveDeptId());
         // 闄勪欢缁戝畾
         fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.APPROVE_PROCESS, approveProcess.getId(), approveProcessVO.getStorageBlobDTOS());
         /*娑堟伅閫氱煡*/
@@ -117,56 +157,24 @@
         }
     }
 
-    private ApproveProcess buildApproveProcess(ApproveProcessVO approveProcessVO, SysUser sysUser, SysDept sysDept,
-                                               List<Long> nodeIds, List<SysUser> sysUsers, Integer approveStatus) throws Exception {
-        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
-        ApproveProcess approveProcess = new ApproveProcess();
-        String no = OrderUtils.countTodayByCreateTime(approveProcessMapper, "", "approve_id", approveProcess.getCreateTime() != null ? approveProcess.getCreateTime() : LocalDateTime.now());
-        approveProcess.setApproveId(no);
-        approveProcess.setApproveUser(sysUser.getUserId());
-        approveProcess.setApproveUserName(sysUser.getNickName());
-        approveProcess.setApproveDeptId(sysDept.getDeptId());
-        approveProcess.setApproveDeptName(sysDept.getDeptName());
-        approveProcess.setApproveUserIds(nodeIds.stream().map(String::valueOf).collect(Collectors.joining(",")));
-        approveProcess.setApproveUserNames(sysUsers.stream().map(SysUser::getNickName).collect(Collectors.joining(",")));
-        approveProcess.setApproveTime(StringUtils.isEmpty(approveProcessVO.getApproveTime()) ? new Date() : dateFormat.parse(approveProcessVO.getApproveTime()));
-        approveProcess.setApproveReason(approveProcessVO.getApproveReason());
-        approveProcess.setDeviceRepairId(approveProcessVO.getDeviceRepairId());
-        approveProcess.setMaintenancePrice(approveProcessVO.getMaintenancePrice());
-        approveProcess.setPrice(approveProcessVO.getPrice());
-        approveProcess.setStartDate(approveProcessVO.getStartDate());
-        approveProcess.setEndDate(approveProcessVO.getEndDate());
-        approveProcess.setStartDateTime(approveProcessVO.getStartDateTime());
-        approveProcess.setEndDateTime(approveProcessVO.getEndDateTime());
-        approveProcess.setApproveStatus(approveStatus);
-        approveProcess.setApproveDelete(0);
-        approveProcess.setApproveType(approveProcessVO.getApproveType());
-        approveProcess.setCreateTime(LocalDateTime.now());
-        approveProcess.setTenantId(approveProcessVO.getApproveDeptId());
-        if (!CollectionUtils.isEmpty(nodeIds)) {
-            SysUser currentUser = sysUsers.stream()
-                    .filter(user -> user.getUserId().equals(nodeIds.get(0)))
-                    .findFirst()
-                    .orElseThrow(() -> new RuntimeException("瀹℃牳鐢ㄦ埛涓嶅瓨鍦�"));
-            approveProcess.setApproveUserCurrentId(currentUser.getUserId());
-            approveProcess.setApproveUserCurrentName(currentUser.getNickName());
+    private void autoPassPurchaseApproveIfNoApprover(ApproveProcessVO approveProcessVO) {
+        if (!Objects.equals(approveProcessVO.getApproveType(), 5)
+                || !StringUtils.hasText(approveProcessVO.getApproveReason())) {
+            throw new RuntimeException("瀹℃牳鐢ㄦ埛涓嶅瓨鍦�");
         }
-        if (approveStatus.equals(2) || approveStatus.equals(3) || approveStatus.equals(4)) {
-            approveProcess.setApproveOverTime(new Date());
-        }
-        return approveProcess;
-    }
 
-    private void markResubmitted(ApproveProcessVO approveProcessVO) {
-        if (approveProcessVO.getId() == null) {
-            return;
+        purchaseLedgerMapper.update(null, new LambdaUpdateWrapper<PurchaseLedger>()
+                .eq(PurchaseLedger::getPurchaseContractNumber, approveProcessVO.getApproveReason())
+                .set(PurchaseLedger::getApprovalStatus, 3));
+        //閲囪喘鍏ュ簱
+        PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectOne(new LambdaQueryWrapper<PurchaseLedger>()
+                .eq(PurchaseLedger::getPurchaseContractNumber, approveProcessVO.getApproveReason())
+                .last("limit 1"));
+        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new QueryWrapper<SalesLedgerProduct>()
+                .lambda().eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedger.getId()).eq(SalesLedgerProduct::getType, 2));
+        for (SalesLedgerProduct salesLedgerProduct : salesLedgerProducts) {
+            stockUtils.addStockWithBatchNo(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId(),purchaseLedger.getPurchaseContractNumber()+"-"+salesLedgerProduct.getId());
         }
-        ApproveProcess approveProcess = approveProcessMapper.selectById(approveProcessVO.getId());
-        if (approveProcess == null) {
-            return;
-        }
-        approveProcess.setApproveStatus(4);
-        approveProcessMapper.updateById(approveProcess);
     }
 
     @Override
diff --git a/src/main/java/com/ruoyi/approve/utils/ApproveProcessConfigNodeUtils.java b/src/main/java/com/ruoyi/approve/utils/ApproveProcessConfigNodeUtils.java
index 239726a..4ae03e6 100644
--- a/src/main/java/com/ruoyi/approve/utils/ApproveProcessConfigNodeUtils.java
+++ b/src/main/java/com/ruoyi/approve/utils/ApproveProcessConfigNodeUtils.java
@@ -1,370 +1,9 @@
 package com.ruoyi.approve.utils;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.ruoyi.approve.pojo.ApprovalInstance;
-import com.ruoyi.approve.pojo.ApprovalInstanceNode;
-import com.ruoyi.approve.pojo.ApprovalRecord;
-import com.ruoyi.approve.pojo.ApprovalTask;
-import com.ruoyi.approve.pojo.ApprovalTemplateNode;
-import com.ruoyi.approve.pojo.ApprovalTemplateNodeApprover;
-import com.ruoyi.approve.service.ApprovalInstanceNodeService;
-import com.ruoyi.approve.service.ApprovalRecordService;
-import com.ruoyi.approve.service.ApprovalTaskService;
-import com.ruoyi.approve.service.ApprovalTemplateNodeApproverService;
-import com.ruoyi.approve.service.ApprovalTemplateNodeService;
 import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
 
-import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * 瀹℃壒娴佺▼鑺傜偣宸ュ叿绫�
- */
-@Component
 @RequiredArgsConstructor
 public class ApproveProcessConfigNodeUtils {
 
-    private final ApprovalInstanceNodeService instanceNodeService;
-    private final ApprovalTaskService approvalTaskService;
-    private final ApprovalRecordService approvalRecordService;
-    private final ApprovalTemplateNodeService approvalTemplateNodeService;
-    private final ApprovalTemplateNodeApproverService approvalTemplateNodeApproverService;
 
-    /**
-     * 鎸夊綋鍓嶅眰绾у垱寤哄鎵硅妭鐐瑰拰瀹℃壒浠诲姟銆�
-     * 璇ラ噸杞戒細鍚屾椂鍐欏叆涓�鏉″彂璧峰鎵硅褰曘��
-     */
-    @Transactional(rollbackFor = Exception.class)
-    public ApprovalInstanceNode createCurrentNodeAndTasks(ApprovalInstance instance) {
-        return createCurrentNodeAndTasks(instance, true);
-    }
-
-    /**
-     * 鎸夊綋鍓嶅眰绾у垱寤哄鎵硅妭鐐瑰拰瀹℃壒浠诲姟銆�
-     *
-     * @param instance 瀹℃壒瀹炰緥
-     * @param createSubmitRecord 鏄惁鍒涘缓鍙戣捣瀹℃壒璁板綍
-     * @return 鍒涘缓鍑虹殑褰撳墠鑺傜偣瀹炰緥
-     */
-    @Transactional(rollbackFor = Exception.class)
-    public ApprovalInstanceNode createCurrentNodeAndTasks(ApprovalInstance instance, boolean createSubmitRecord) {
-        if (instance == null || instance.getId() == null) {
-            throw new RuntimeException("瀹℃壒瀹炰緥涓嶈兘涓虹┖");
-        }
-        if (instance.getTemplateId() == null) {
-            throw new RuntimeException("瀹℃壒妯℃澘涓嶈兘涓虹┖");
-        }
-
-        Integer currentLevel = instance.getCurrentLevel() == null ? 1 : instance.getCurrentLevel();
-
-        ApprovalInstanceNode existsNode = instanceNodeService.getOne(
-                new LambdaQueryWrapper<ApprovalInstanceNode>()
-                        .eq(ApprovalInstanceNode::getInstanceId, instance.getId())
-                        .eq(ApprovalInstanceNode::getLevelNo, currentLevel)
-                        .eq(ApprovalInstanceNode::getDeleted, 0)
-                        .last("LIMIT 1")
-        );
-        if (existsNode != null) {
-            return existsNode;
-        }
-
-        ApprovalTemplateNode templateNode = approvalTemplateNodeService.getOne(
-                new LambdaQueryWrapper<ApprovalTemplateNode>()
-                        .eq(ApprovalTemplateNode::getTemplateId, instance.getTemplateId())
-                        .eq(ApprovalTemplateNode::getLevelNo, currentLevel)
-                        .orderByAsc(ApprovalTemplateNode::getId)
-                        .last("LIMIT 1")
-        );
-        if (templateNode == null) {
-            throw new RuntimeException("鏈壘鍒板綋鍓嶅眰绾у搴旂殑瀹℃壒妯℃澘鑺傜偣");
-        }
-
-        List<ApprovalTemplateNodeApprover> approvers = approvalTemplateNodeApproverService.list(
-                new LambdaQueryWrapper<ApprovalTemplateNodeApprover>()
-                        .eq(ApprovalTemplateNodeApprover::getTemplateId, instance.getTemplateId())
-                        .eq(ApprovalTemplateNodeApprover::getNodeId, templateNode.getId())
-                        .eq(ApprovalTemplateNodeApprover::getDeleted, 0L)
-                        .orderByAsc(ApprovalTemplateNodeApprover::getSortNo)
-        );
-        if (approvers == null || approvers.isEmpty()) {
-            throw new RuntimeException("褰撳墠瀹℃壒鑺傜偣鏈厤缃鎵逛汉");
-        }
-
-        ApprovalInstanceNode instanceNode = new ApprovalInstanceNode();
-        instanceNode.setInstanceId(instance.getId());
-        instanceNode.setLevelNo(templateNode.getLevelNo());
-        instanceNode.setApproveType(templateNode.getApproveType());
-        instanceNode.setStatus("PENDING");
-        instanceNode.setStartTime(LocalDateTime.now());
-        instanceNode.setDeleted((byte) 0);
-        instanceNodeService.save(instanceNode);
-
-        List<ApprovalTask> taskList = new ArrayList<>(approvers.size());
-        for (ApprovalTemplateNodeApprover approver : approvers) {
-            ApprovalTask task = new ApprovalTask();
-            task.setInstanceId(instance.getId());
-            task.setNodeId(instanceNode.getId());
-            task.setLevelNo(instanceNode.getLevelNo());
-            task.setApproverId(approver.getApproverId());
-            task.setApproverName(approver.getApproverName());
-            task.setTaskStatus("PENDING");
-            task.setIsRead((byte) 0);
-            task.setDeleted((byte) 0);
-            taskList.add(task);
-        }
-        approvalTaskService.saveBatch(taskList);
-
-        if (createSubmitRecord) {
-            ApprovalRecord record = new ApprovalRecord();
-            record.setInstanceId(instance.getId());
-            record.setNodeId(instanceNode.getId());
-            record.setOperatorId(instance.getApplicantId());
-            record.setOperatorName(instance.getApplicantName());
-            record.setAction("SUBMIT");
-            record.setComment("鍙戣捣瀹℃壒");
-            record.setDeleted((byte) 0);
-            approvalRecordService.save(record);
-        }
-
-        return instanceNode;
-    }
-
-    /**
-     * 鏌ヨ褰撳墠寰呭鐞嗚妭鐐广��
-     */
-    public ApprovalInstanceNode getCurrentNode(Long instanceId) {
-        if (instanceId == null) {
-            return null;
-        }
-
-        return instanceNodeService.getOne(
-                new LambdaQueryWrapper<ApprovalInstanceNode>()
-                        .eq(ApprovalInstanceNode::getInstanceId, instanceId)
-                        .eq(ApprovalInstanceNode::getStatus, "PENDING")
-                        .eq(ApprovalInstanceNode::getDeleted, 0)
-                        .orderByAsc(ApprovalInstanceNode::getLevelNo)
-                        .last("LIMIT 1")
-        );
-    }
-
-    /**
-     * 鏌ヨ褰撳墠瀹℃壒灞傜骇銆�
-     */
-    public Integer getCurrentLevel(Long instanceId) {
-        ApprovalInstanceNode currentNode = getCurrentNode(instanceId);
-        return currentNode != null ? currentNode.getLevelNo() : null;
-    }
-
-    /**
-     * 鏌ヨ褰撳墠鑺傜偣涓嬬殑寰呭鎵逛换鍔°��
-     */
-    public List<ApprovalTask> getCurrentPendingTasks(Long instanceId) {
-        if (instanceId == null) {
-            return List.of();
-        }
-
-        ApprovalInstanceNode currentNode = getCurrentNode(instanceId);
-        if (currentNode == null) {
-            return List.of();
-        }
-
-        return approvalTaskService.list(
-                new LambdaQueryWrapper<ApprovalTask>()
-                        .eq(ApprovalTask::getInstanceId, instanceId)
-                        .eq(ApprovalTask::getNodeId, currentNode.getId())
-                        .eq(ApprovalTask::getTaskStatus, "PENDING")
-                        .eq(ApprovalTask::getDeleted, 0)
-                        .orderByAsc(ApprovalTask::getLevelNo)
-        );
-    }
-
-    /**
-     * 鏌ヨ褰撳墠鐢ㄦ埛鍦ㄥ綋鍓嶈妭鐐逛笂鐨勫緟瀹℃壒浠诲姟銆�
-     */
-    public ApprovalTask getCurrentUserTask(Long instanceId, Long userId) {
-        if (instanceId == null || userId == null) {
-            return null;
-        }
-
-        ApprovalInstanceNode currentNode = getCurrentNode(instanceId);
-        if (currentNode == null) {
-            return null;
-        }
-
-        return approvalTaskService.getOne(
-                new LambdaQueryWrapper<ApprovalTask>()
-                        .eq(ApprovalTask::getInstanceId, instanceId)
-                        .eq(ApprovalTask::getNodeId, currentNode.getId())
-                        .eq(ApprovalTask::getApproverId, userId)
-                        .eq(ApprovalTask::getTaskStatus, "PENDING")
-                        .eq(ApprovalTask::getDeleted, 0)
-                        .last("LIMIT 1")
-        );
-    }
-
-    /**
-     * 鍒ゆ柇褰撳墠鐢ㄦ埛鏄惁鏄綋鍓嶅鎵逛汉銆�
-     */
-    public boolean isCurrentApprover(Long instanceId, Long userId) {
-        return getCurrentUserTask(instanceId, userId) != null;
-    }
-
-    /**
-     * 鏌ヨ褰撳墠鑺傜偣鐨勫鎵逛汉 ID 鍒楄〃銆�
-     */
-    public List<Long> getCurrentNodeApproverIds(Long instanceId) {
-        return getCurrentPendingTasks(instanceId).stream()
-                .map(ApprovalTask::getApproverId)
-                .distinct()
-                .collect(Collectors.toList());
-    }
-
-    /**
-     * 鏌ヨ褰撳墠鑺傜偣鍓╀綑寰呭鎵逛汉鏁般��
-     */
-    public int getRemainingApproverCount(Long instanceId) {
-        return getCurrentPendingTasks(instanceId).size();
-    }
-
-    /**
-     * 鏌ヨ褰撳墠鑺傜偣宸插悓鎰忎汉鏁般��
-     */
-    public int getApprovedCount(Long instanceId) {
-        if (instanceId == null) {
-            return 0;
-        }
-
-        ApprovalInstanceNode currentNode = getCurrentNode(instanceId);
-        if (currentNode == null) {
-            return 0;
-        }
-
-        return Math.toIntExact(approvalTaskService.count(
-                new LambdaQueryWrapper<ApprovalTask>()
-                        .eq(ApprovalTask::getInstanceId, instanceId)
-                        .eq(ApprovalTask::getNodeId, currentNode.getId())
-                        .eq(ApprovalTask::getTaskStatus, "APPROVED")
-                        .eq(ApprovalTask::getDeleted, 0)
-        ));
-    }
-
-    /**
-     * 鏌ヨ褰撳墠鑺傜偣宸叉嫆缁濅汉鏁般��
-     */
-    public int getRejectedCount(Long instanceId) {
-        if (instanceId == null) {
-            return 0;
-        }
-
-        ApprovalInstanceNode currentNode = getCurrentNode(instanceId);
-        if (currentNode == null) {
-            return 0;
-        }
-
-        return Math.toIntExact(approvalTaskService.count(
-                new LambdaQueryWrapper<ApprovalTask>()
-                        .eq(ApprovalTask::getInstanceId, instanceId)
-                        .eq(ApprovalTask::getNodeId, currentNode.getId())
-                        .eq(ApprovalTask::getTaskStatus, "REJECTED")
-                        .eq(ApprovalTask::getDeleted, 0)
-        ));
-    }
-
-    /**
-     * 鍒ゆ柇褰撳墠鑺傜偣鏄惁鍙互娴佽浆鍒颁笅涓�灞傘��
-     */
-    public boolean canProceedToNextLevel(Long instanceId, String approveType) {
-        if (instanceId == null || approveType == null) {
-            return false;
-        }
-
-        if (getRejectedCount(instanceId) > 0) {
-            return false;
-        }
-
-        int totalApproverCount = getCurrentPendingTasks(instanceId).size() + getApprovedCount(instanceId);
-        int approvedCount = getApprovedCount(instanceId);
-
-        if ("AND".equalsIgnoreCase(approveType)) {
-            return approvedCount > 0 && approvedCount == totalApproverCount;
-        }
-        if ("OR".equalsIgnoreCase(approveType)) {
-            return approvedCount > 0;
-        }
-        return false;
-    }
-
-    /**
-     * 鏌ヨ褰撳墠鐢ㄦ埛鍦ㄥ綋鍓嶈妭鐐逛笂鐨勪换鍔$姸鎬併��
-     */
-    public String getUserTaskStatus(Long instanceId, Long userId) {
-        if (instanceId == null || userId == null) {
-            return null;
-        }
-
-        ApprovalInstanceNode currentNode = getCurrentNode(instanceId);
-        if (currentNode == null) {
-            return null;
-        }
-
-        ApprovalTask task = approvalTaskService.getOne(
-                new LambdaQueryWrapper<ApprovalTask>()
-                        .eq(ApprovalTask::getInstanceId, instanceId)
-                        .eq(ApprovalTask::getNodeId, currentNode.getId())
-                        .eq(ApprovalTask::getApproverId, userId)
-                        .eq(ApprovalTask::getDeleted, 0)
-                        .last("LIMIT 1")
-        );
-
-        return task != null ? task.getTaskStatus() : null;
-    }
-
-    /**
-     * 鏌ヨ鎸囧畾鐢ㄦ埛鐨勫叏閮ㄥ緟瀹℃壒浠诲姟銆�
-     */
-    public List<ApprovalTask> getUserAllPendingTasks(Long userId) {
-        if (userId == null) {
-            return List.of();
-        }
-
-        return approvalTaskService.list(
-                new LambdaQueryWrapper<ApprovalTask>()
-                        .eq(ApprovalTask::getApproverId, userId)
-                        .eq(ApprovalTask::getTaskStatus, "PENDING")
-                        .eq(ApprovalTask::getDeleted, 0)
-                        .orderByDesc(ApprovalTask::getCreateTime)
-        );
-    }
-
-    /**
-     * 鏌ヨ瀹℃壒瀹炰緥鐨勮繘搴︽憳瑕併��
-     */
-    public String getApprovalProgress(Long instanceId) {
-        if (instanceId == null) {
-            return "鏃犳晥鐨勫鎵瑰疄渚�";
-        }
-
-        ApprovalInstanceNode currentNode = getCurrentNode(instanceId);
-        if (currentNode == null) {
-            return "瀹℃壒宸插畬鎴愭垨灏氭湭寮�濮�";
-        }
-
-        int approvedCount = getApprovedCount(instanceId);
-        int rejectedCount = getRejectedCount(instanceId);
-        int pendingCount = getRemainingApproverCount(instanceId);
-        int totalCount = approvedCount + rejectedCount + pendingCount;
-
-        return String.format(
-                "绗�%d绾у鎵癸細鎬讳汉鏁�=%d锛屽凡鍚屾剰=%d锛屽凡鎷掔粷=%d锛屽緟瀹℃壒=%d",
-                currentNode.getLevelNo(),
-                totalCount,
-                approvedCount,
-                rejectedCount,
-                pendingCount
-        );
-    }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/ruoyi/basic/controller/StorageAttachmentController.java b/src/main/java/com/ruoyi/basic/controller/StorageAttachmentController.java
index 79ae5d4..d937e27 100644
--- a/src/main/java/com/ruoyi/basic/controller/StorageAttachmentController.java
+++ b/src/main/java/com/ruoyi/basic/controller/StorageAttachmentController.java
@@ -2,6 +2,8 @@
 
 import com.ruoyi.basic.dto.StorageAttachmentDTO;
 import com.ruoyi.basic.service.StorageAttachmentService;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -35,6 +37,7 @@
      * @param ids 鏂囦欢id鍒楄〃
      * @return 鍒犻櫎缁撴灉
      */
+    @Log(title = "瀛樺偍闄勪欢", businessType = BusinessType.DELETE)
     @DeleteMapping("/delete")
     @Operation(summary = "鍒犻櫎閫氱敤鏂囦欢涓婁紶鐨勯檮浠朵俊鎭�")
     public R batchDelete(@RequestBody List<Long> ids) {
@@ -44,6 +47,7 @@
     /**
      * 淇濆瓨閫氱敤鏂囦欢涓婁紶鐨勯檮浠朵俊鎭�
      */
+    @Log(title = "瀛樺偍闄勪欢", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     @Operation(summary = "淇濆瓨閫氱敤鏂囦欢涓婁紶鐨勯檮浠朵俊鎭�")
     public R add(@RequestBody StorageAttachmentDTO storageAttachmentDTO) {
diff --git a/src/main/java/com/ruoyi/basic/controller/SupplierManageController.java b/src/main/java/com/ruoyi/basic/controller/SupplierManageController.java
index 1a58500..05d262c 100644
--- a/src/main/java/com/ruoyi/basic/controller/SupplierManageController.java
+++ b/src/main/java/com/ruoyi/basic/controller/SupplierManageController.java
@@ -28,6 +28,7 @@
      * @param supplierManage
      * @return
      */
+    @Log(title = "渚涘簲鍟嗙鐞�", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public AjaxResult add(@RequestBody SupplierManage supplierManage) {
         supplierService.saveSupplier(supplierManage);
@@ -39,6 +40,7 @@
      * @param ids
      * @return
      */
+    @Log(title = "渚涘簲鍟嗙鐞�", businessType = BusinessType.DELETE)
     @DeleteMapping("/del")
     public AjaxResult delSupplier(@RequestBody List<Integer> ids) {
         if(CollectionUtils.isEmpty(ids)){
@@ -63,6 +65,7 @@
      * @param supplierManage
      * @return
      */
+    @Log(title = "渚涘簲鍟嗙鐞�", businessType = BusinessType.UPDATE)
     @PostMapping("/update")
     public AjaxResult update(@RequestBody SupplierManage supplierManage) {
         supplierService.supplierUpdate(supplierManage);
@@ -85,6 +88,7 @@
      * @param response
      * @param supplierManageDto
      */
+    @Log(title = "渚涘簲鍟嗙鐞�", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void supplierExport(HttpServletResponse response,SupplierManageDto supplierManageDto) {
         supplierService.supplierExport(response, supplierManageDto);
diff --git a/src/main/java/com/ruoyi/basic/controller/SupplierManageFileController.java b/src/main/java/com/ruoyi/basic/controller/SupplierManageFileController.java
index 2d43f65..213a851 100644
--- a/src/main/java/com/ruoyi/basic/controller/SupplierManageFileController.java
+++ b/src/main/java/com/ruoyi/basic/controller/SupplierManageFileController.java
@@ -3,6 +3,8 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.basic.pojo.SupplierManageFile;
 import com.ruoyi.basic.service.SupplierManageFileService;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
@@ -27,6 +29,7 @@
      * @param supplierManageFile
      * @return
      */
+    @Log(title = "鏂板渚涘簲鍟嗛檮浠�", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public AjaxResult add(@RequestBody SupplierManageFile supplierManageFile) {
         return AjaxResult.success(supplierManageFileService.save(supplierManageFile));
@@ -37,6 +40,7 @@
      * @param ids
      * @return
      */
+    @Log(title = "鍒犻櫎渚涘簲鍟嗛檮浠�", businessType = BusinessType.DELETE)
     @DeleteMapping("/del")
     public AjaxResult delSupplierManageFile(@RequestBody List<Integer> ids) {
         if(CollectionUtils.isEmpty(ids)){
diff --git a/src/main/java/com/ruoyi/basic/enums/ApplicationTypeEnum.java b/src/main/java/com/ruoyi/basic/enums/ApplicationTypeEnum.java
index 8b069a0..8cdf321 100644
--- a/src/main/java/com/ruoyi/basic/enums/ApplicationTypeEnum.java
+++ b/src/main/java/com/ruoyi/basic/enums/ApplicationTypeEnum.java
@@ -5,8 +5,7 @@
     FILE("file"),
     AFTER_FILE("after_file"),
     BEFORE_FILE("before_file"),
-    APK("apk"),
-    RAG_FILE("rag_file");
+    APK("apk");
 
 
     private final String type;
diff --git a/src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java b/src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java
index b0c01bb..6fa2822 100644
--- a/src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java
+++ b/src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java
@@ -194,15 +194,9 @@
     // Account
     SALES_REFUND_AMOUNT_ORDER("sales_refund_amount_order"),
     SALES_RECEIPT_RETURN("sales_receipt_return"),
-    ACCOUNT_EXPENSE("account_expense"),
-    FIN_REIMBURSEMENT("fin_reimbursement"),
     FIN_VOUCHER("fin_voucher"),
-    ACCOUNT_FILE("account_file"),
-    ENTERPRISE_NEWS("enterprise_news"),
-    APPROVAL_INSTANCE("approval_instance"),
     ACCOUNT_INVOICE_APPLICATION("account_invoice_application"),
-    ACCOUNT_PURCHASE_INVOICE("account_purchase_invoice"),
-    APPROVAL_TEMPLATE("approval_template");
+    ACCOUNT_PURCHASE_INVOICE("account_purchase_invoice");
 
     private final String type;
     RecordTypeEnum(String type) { this.type = type; }
diff --git a/src/main/java/com/ruoyi/basic/mapper/CustomerMapper.java b/src/main/java/com/ruoyi/basic/mapper/CustomerMapper.java
index f871b91..d29ac3b 100644
--- a/src/main/java/com/ruoyi/basic/mapper/CustomerMapper.java
+++ b/src/main/java/com/ruoyi/basic/mapper/CustomerMapper.java
@@ -12,6 +12,7 @@
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 瀹㈡埛妗fMapper鎺ュ彛
@@ -20,55 +21,7 @@
  * @date 2025-05-07
  */
 @Mapper
-public interface CustomerMapper extends BaseMapper<Customer>
-{
-    /**
-     * 鏌ヨ瀹㈡埛妗f
-     *
-     * @param id 瀹㈡埛妗f涓婚敭
-     * @return 瀹㈡埛妗f
-     */
-    Customer selectCustomerById(Long id);
-
-    /**
-     * 鏌ヨ瀹㈡埛妗f鍒楄〃
-     *
-     * @param customer 瀹㈡埛妗f
-     * @return 瀹㈡埛妗f闆嗗悎
-     */
-    List<Customer> selectCustomerList(Customer customer);
-
-    /**
-     * 鏂板瀹㈡埛妗f
-     *
-     * @param customer 瀹㈡埛妗f
-     * @return 缁撴灉
-     */
-    int insertCustomer(Customer customer);
-
-    /**
-     * 淇敼瀹㈡埛妗f
-     *
-     * @param customer 瀹㈡埛妗f
-     * @return 缁撴灉
-     */
-    int updateCustomer(Customer customer);
-
-    /**
-     * 鍒犻櫎瀹㈡埛妗f
-     *
-     * @param id 瀹㈡埛妗f涓婚敭
-     * @return 缁撴灉
-     */
-    int deleteCustomerById(Long id);
-
-    /**
-     * 鎵归噺鍒犻櫎瀹㈡埛妗f
-     *
-     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁涓婚敭闆嗗悎
-     * @return 缁撴灉
-     */
-    int deleteCustomerByIds(Long[] ids);
+public interface CustomerMapper extends BaseMapper<Customer> {
 
     IPage<CustomerVo> listPage(Page<CustomerDto> page, @Param("c") CustomerDto customer, @Param("loginUserId") Long loginUserId);
 
@@ -77,4 +30,8 @@
     IPage<CustomerTransactionsVo> customewTransactions(Page page, @Param("customerName") String customerName);
 
     IPage<CustomerTransactionsDetailsVo> customewTransactionsDetails(Page page, @Param("customerId") Long customerId);
+
+    List<Map<String, Object>> getShippedAmountByCustomerIds(@Param("customerIds") List<Long> customerIds);
+
+    List<Map<String, Object>> getShippedAmountBySalesLedgerIds(@Param("salesLedgerIds") List<Long> salesLedgerIds);
 }
diff --git a/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
index 5a4d19a..1c27133 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
+++ b/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
@@ -16,17 +16,14 @@
 import com.ruoyi.basic.pojo.CustomerUser;
 import com.ruoyi.basic.service.*;
 import com.ruoyi.basic.vo.CustomerVo;
+import com.ruoyi.common.utils.AmountUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.security.LoginUser;
 import com.ruoyi.framework.web.domain.R;
-import com.ruoyi.procurementrecord.mapper.ReturnManagementMapper;
-import com.ruoyi.procurementrecord.pojo.ReturnManagement;
 import com.ruoyi.sales.mapper.SalesLedgerMapper;
-import com.ruoyi.sales.mapper.SalesQuotationMapper;
 import com.ruoyi.sales.pojo.SalesLedger;
-import com.ruoyi.sales.pojo.SalesQuotation;
 import com.ruoyi.sales.vo.CustomerTransactionsDetailsVo;
 import com.ruoyi.sales.vo.CustomerTransactionsVo;
 import lombok.AllArgsConstructor;
@@ -38,6 +35,7 @@
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.math.BigDecimal;
 import java.time.ZoneId;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -54,11 +52,7 @@
 @Slf4j
 public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> implements ICustomerService {
     @Autowired
-    private SalesLedgerMapper salesLedgerMapper;
-    @Autowired
-    private SalesQuotationMapper salesQuotationMapper;
-    @Autowired
-    private ReturnManagementMapper returnManagementMapper;
+    private  SalesLedgerMapper salesLedgerMapper;
     @Autowired
     private CustomerMapper customerMapper;
 
@@ -212,7 +206,6 @@
     public int updateCustomer(Customer customer) {
         LoginUser loginUser = SecurityUtils.getLoginUser();
         Long tenantId = loginUser.getTenantId();
-        validateCustomerEditPermission(customer.getId());
         customer.setTenantId(tenantId);
         return customerMapper.updateById(customer);
     }
@@ -227,26 +220,12 @@
     @Transactional(rollbackFor = Exception.class)
     public int deleteCustomerByIds(Long[] ids) {
         List<Long> idList = Arrays.asList(ids);
-        // 妫�鏌ユ槸鍚︽湁閿�鍞彴璐﹀叧鑱�
         List<SalesLedger> salesLedgers = salesLedgerMapper.selectList(new QueryWrapper<SalesLedger>().lambda().in(SalesLedger::getCustomerId, idList));
         if (!salesLedgers.isEmpty()) {
-            throw new RuntimeException("瀹㈡埛妗f涓嬫湁閿�鍞彴璐︼紝璇峰厛鍒犻櫎閿�鍞彴璐�");
+            throw new RuntimeException("瀹㈡埛妗f涓嬫湁閿�鍞悎鍚岋紝璇峰厛鍒犻櫎閿�鍞悎鍚�");
         }
-
-        // 妫�鏌ユ槸鍚︽湁閿�鍞��璐у叧鑱�
-        List<ReturnManagement> returnManagements = returnManagementMapper.selectList(new QueryWrapper<ReturnManagement>().lambda().in(ReturnManagement::getCustomerId, idList));
-        if (!returnManagements.isEmpty()) {
-            throw new RuntimeException("瀹㈡埛妗f涓嬫湁閿�鍞��璐э紝璇峰厛鍒犻櫎閿�鍞��璐�");
-        }
-
-        // 妫�鏌ユ槸鍚︽湁閿�鍞姤浠峰叧鑱�
-        List<SalesQuotation> salesQuotations = salesQuotationMapper.selectList(new QueryWrapper<SalesQuotation>().lambda().in(SalesQuotation::getCustomerId, idList));
-        if (!salesQuotations.isEmpty()) {
-            throw new RuntimeException("瀹㈡埛妗f涓嬫湁閿�鍞姤浠凤紝璇峰厛鍒犻櫎閿�鍞姤浠�");
-        }
-
         // 鏌ヨ鏄惁鏈夊凡鍒嗛厤鐨勫叕娴峰鎴�
-        List<Customer> assignedPools = customerMapper.selectList(
+        /*List<Customer> assignedPools = customerMapper.selectList(
                 new QueryWrapper<Customer>().lambda()
                         .in(Customer::getId, idList)
                         .eq(Customer::getType, 1).
@@ -254,7 +233,7 @@
         );
         if (!assignedPools.isEmpty()) {
             throw new RuntimeException("瀹㈡埛妗f涓嬫湁宸插垎閰嶇殑鍏捣瀹㈡埛锛岃鍏堟敹鍥�");
-        }
+        }*/
         // 鍒犻櫎瀹㈡埛鐨勫悓鏃朵篃闇�瑕佸垹闄ゅ搴旂殑瀹㈡埛璺熼殢銆侀檮浠跺拰鍥炶鎻愰啋
         for (Long id : ids) {
             customerFollowUpService.deleteByCustomerId(id);
@@ -294,11 +273,11 @@
             }
 
             // 鏍规嵁 type 鍙傛暟璁剧疆瀹㈡埛绫诲瀷锛堢娴�/鍏捣锛�
-            if (type != null) {
+            /*if (type != null) {
                 userList.forEach(customer -> {
                     customer.setType(type);
                 });
-            }
+            }*/
             this.saveOrUpdateBatch(userList);
             return R.ok(true);
         } catch (Exception e) {
@@ -310,26 +289,18 @@
 
     @Override
     public List<Map<String, Object>> customerList(Customer customer) {
-        LoginUser loginUser = SecurityUtils.getLoginUser();
-        Long loginUserId = loginUser.getUserId();
-        CustomerDto query = new CustomerDto();
-        if (customer != null) {
-            BeanUtils.copyProperties(customer, query);
-        }
+        LambdaQueryWrapper<Customer> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.select(Customer::getId, Customer::getCustomerName, Customer::getTaxpayerIdentificationNumber);
 
-        // 澶嶇敤瀹㈡埛鍒楄〃鐨勫彲瑙佹�ц鍒欙紝閬垮厤鎶婂埆浜虹殑绉佹捣瀹㈡埛鏆撮湶缁欏綋鍓嶈处鍙�
-        List<CustomerVo> visibleCustomers = customerMapper.list(query, loginUserId);
-        if (CollectionUtils.isEmpty(visibleCustomers)) {
-            return Collections.emptyList();
-        }
+        // 鑾峰彇鍘熷鏌ヨ缁撴灉
+        List<Map<String, Object>> result = customerMapper.selectMaps(queryWrapper);
 
-        return visibleCustomers.stream().map(item -> {
-            Map<String, Object> map = new LinkedHashMap<>();
-            map.put("id", item.getId());
-            map.put("customerName", item.getCustomerName());
-            map.put("taxpayerIdentificationNumber", item.getTaxpayerIdentificationNumber());
-            return map;
-        }).collect(Collectors.toList());
+        // 灏嗕笅鍒掔嚎鍛藉悕杞崲涓洪┘宄板懡鍚�
+        return result.stream().map(map -> map.entrySet().stream()
+                .collect(Collectors.toMap(
+                        entry -> underlineToCamel(entry.getKey()),
+                        Map.Entry::getValue))
+        ).collect(Collectors.toList());
     }
 
     // 鍒嗛厤鍏捣瀹㈡埛缁欑娴�
@@ -350,7 +321,6 @@
     public void recycleCustomer(CustomerDto customerDto) {
         Customer customer = customerMapper.selectById(customerDto.getId());
         if (customer.getType() == 1 && customer.getIsAssigned() == 1) {  // 鍏捣涓斿凡鍒嗛厤
-            validatePublicSeaRecyclePermission(customer.getId());
             customer.setIsAssigned(0);
             customer.setUsageStatus(0L);
             customer.setUsageUser(0L);
@@ -413,52 +383,60 @@
         return this.updateById(customer);
     }
 
-    private void validateCustomerEditPermission(Long customerId) {
-        Customer customer = customerMapper.selectById(customerId);
-        if (customer == null) {
-            throw new RuntimeException("瀹㈡埛妗f涓嶅瓨鍦�");
-        }
-        if (!hasSalesModuleReference(customerId)) {
-            return;
-        }
-        if (Objects.equals(customer.getType(), 0)) {
-            throw new RuntimeException("宸茶閿�鍞ā鍧楀紩鐢ㄧ殑绉佹捣瀹㈡埛涓嶈兘缂栬緫");
-        }
-        if (Objects.equals(customer.getType(), 1) && Objects.equals(customer.getIsAssigned(), 1)) {
-            throw new RuntimeException("宸查鐢ㄥ苟涓旇閿�鍞ā鍧楀紩鐢ㄧ殑鍏捣瀹㈡埛涓嶈兘缂栬緫");
-        }
-    }
-
-    private void validatePublicSeaRecyclePermission(Long customerId) {
-        if (hasSalesModuleReference(customerId)) {
-            throw new RuntimeException("宸查鐢ㄥ苟涓旇閿�鍞ā鍧楀紩鐢ㄧ殑鍏捣瀹㈡埛涓嶈兘鍥炴敹");
-        }
-    }
-
-    private boolean hasSalesModuleReference(Long customerId) {
-        Long salesLedgerCount = salesLedgerMapper.selectCount(new QueryWrapper<SalesLedger>().lambda()
-                .eq(SalesLedger::getCustomerId, customerId));
-        if (salesLedgerCount != null && salesLedgerCount > 0) {
-            return true;
-        }
-        Long salesQuotationCount = salesQuotationMapper.selectCount(new QueryWrapper<SalesQuotation>().lambda()
-                .eq(SalesQuotation::getCustomerId, customerId));
-        if (salesQuotationCount != null && salesQuotationCount > 0) {
-            return true;
-        }
-        Long returnManagementCount = returnManagementMapper.selectCount(new QueryWrapper<ReturnManagement>().lambda()
-                .eq(ReturnManagement::getCustomerId, customerId));
-        return returnManagementCount != null && returnManagementCount > 0;
-    }
-
     @Override
     public IPage<CustomerTransactionsVo> customewTransactions(Page page, String customerName) {
-        return customerMapper.customewTransactions(page, customerName);
+        IPage<CustomerTransactionsVo> p = customerMapper.customewTransactions(page, customerName);
+        List<CustomerTransactionsVo> records = p.getRecords();
+        if (!CollectionUtils.isEmpty(records)) {
+            List<Long> customerIds = records.stream().map(CustomerTransactionsVo::getCustomerId).collect(Collectors.toList());
+            List<Map<String, Object>> shippedAmountList = customerMapper.getShippedAmountByCustomerIds(customerIds);
+            Map<Long, BigDecimal> shippedAmountMap = new HashMap<>();
+            for (Map<String, Object> map : shippedAmountList) {
+                if (map.get("outboundAmount") != null) {
+                    shippedAmountMap.put(((Number) map.get("customerId")).longValue(), new BigDecimal(String.valueOf(map.get("outboundAmount"))));
+                }
+            }
+            for (CustomerTransactionsVo vo : records) {
+                BigDecimal outboundAmount = shippedAmountMap.getOrDefault(vo.getCustomerId(), BigDecimal.ZERO);
+                vo.setShippedAmount(outboundAmount);
+                BigDecimal contractAmounts = vo.getContractAmounts() == null ? BigDecimal.ZERO : vo.getContractAmounts();
+                BigDecimal unshippedAmount = contractAmounts.subtract(outboundAmount);
+                if (unshippedAmount.compareTo(BigDecimal.ZERO) < 0) {
+                    unshippedAmount = BigDecimal.ZERO;
+                }
+                vo.setUnshippedAmount(unshippedAmount);
+                AmountUtils.normalizeCustomerTransaction(vo);
+            }
+        }
+        return p;
     }
 
     @Override
     public IPage<CustomerTransactionsDetailsVo> customewTransactionsDetails(Page page, Long customerId) {
-        return customerMapper.customewTransactionsDetails(page, customerId);
+        IPage<CustomerTransactionsDetailsVo> p = customerMapper.customewTransactionsDetails(page, customerId);
+        List<CustomerTransactionsDetailsVo> records = p.getRecords();
+        if (!CollectionUtils.isEmpty(records)) {
+            List<Long> salesLedgerIds = records.stream().map(CustomerTransactionsDetailsVo::getSalesLedgerId).collect(Collectors.toList());
+            List<Map<String, Object>> shippedAmountList = customerMapper.getShippedAmountBySalesLedgerIds(salesLedgerIds);
+            Map<Long, BigDecimal> shippedAmountMap = new HashMap<>();
+            for (Map<String, Object> map : shippedAmountList) {
+                if (map.get("outboundAmount") != null) {
+                    shippedAmountMap.put(((Number) map.get("salesLedgerId")).longValue(), new BigDecimal(String.valueOf(map.get("outboundAmount"))));
+                }
+            }
+            for (CustomerTransactionsDetailsVo vo : records) {
+                BigDecimal outboundAmount = shippedAmountMap.getOrDefault(vo.getSalesLedgerId(), BigDecimal.ZERO);
+                vo.setShippedAmount(outboundAmount);
+                BigDecimal contractAmount = vo.getContractAmount() == null ? BigDecimal.ZERO : vo.getContractAmount();
+                BigDecimal unshippedAmount = contractAmount.subtract(outboundAmount);
+                if (unshippedAmount.compareTo(BigDecimal.ZERO) < 0) {
+                    unshippedAmount = BigDecimal.ZERO;
+                }
+                vo.setUnshippedAmount(unshippedAmount);
+                AmountUtils.normalizeCustomerTransactionDetail(vo);
+            }
+        }
+        return p;
     }
 
     /**
diff --git a/src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java
index 613bde2..a46d8de 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java
+++ b/src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java
@@ -10,38 +10,54 @@
 import com.ruoyi.basic.mapper.SupplierManageMapper;
 import com.ruoyi.basic.pojo.SupplierManage;
 import com.ruoyi.basic.service.ISupplierService;
+import com.ruoyi.common.utils.AmountUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
 import com.ruoyi.purchase.pojo.PurchaseLedger;
 import com.ruoyi.purchase.vo.SupplierTransactionsDetailsVo;
 import com.ruoyi.purchase.vo.SupplierTransactionsVo;
+import com.ruoyi.quality.mapper.QualityInspectMapper;
+import com.ruoyi.quality.mapper.QualityUnqualifiedMapper;
+import com.ruoyi.quality.pojo.QualityInspect;
+import com.ruoyi.quality.pojo.QualityUnqualified;
+import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
+import com.ruoyi.stock.mapper.StockInRecordMapper;
+import com.ruoyi.stock.pojo.StockInRecord;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 @Service
 @RequiredArgsConstructor
-public class SupplierServiceImpl extends ServiceImpl<SupplierManageMapper,SupplierManage> implements ISupplierService {
+public class SupplierServiceImpl extends ServiceImpl<SupplierManageMapper, SupplierManage> implements ISupplierService {
 
     private final SupplierManageMapper supplierMapper;
     private final PurchaseLedgerMapper purchaseLedgerMapper;
+    private final SalesLedgerProductMapper salesLedgerProductMapper;
+    private final StockInRecordMapper stockInRecordMapper;
+    private final QualityInspectMapper qualityInspectMapper;
+    private final QualityUnqualifiedMapper qualityUnqualifiedMapper;
 
     /**
      * 渚涘簲鍟嗘柊澧�
+     *
      * @param supplierManage
      * @return
      */
     @Override
     public void saveSupplier(SupplierManage supplierManage) {
         LambdaQueryWrapper<SupplierManage> supplierManageLambdaQueryWrapper = new LambdaQueryWrapper<>();
-        supplierManageLambdaQueryWrapper.eq(SupplierManage::getSupplierName,supplierManage.getSupplierName());
+        supplierManageLambdaQueryWrapper.eq(SupplierManage::getSupplierName, supplierManage.getSupplierName());
         if (supplierMapper.selectCount(supplierManageLambdaQueryWrapper) > 0) {
             throw new RuntimeException("渚涘簲鍟嗗凡瀛樺湪");
         }
@@ -50,6 +66,7 @@
 
     /**
      * 渚涘簲鍟嗗垹闄�
+     *
      * @param ids
      * @return
      */
@@ -67,6 +84,7 @@
 
     /**
      * 渚涘簲鍟嗚鎯�
+     *
      * @param id
      * @return
      */
@@ -77,6 +95,7 @@
 
     /**
      * 渚涘簲鍟嗕慨鏀�
+     *
      * @param supplierManage
      * @return
      */
@@ -87,17 +106,19 @@
 
     /**
      * 渚涘簲鍟嗗垎椤垫煡璇�
+     *
      * @param page
      * @param supplierManageDto
      * @return
      */
     @Override
     public IPage<SupplierManage> supplierListPage(Page page, SupplierManageDto supplierManageDto) {
-        return supplierMapper.supplierListPage(page,supplierManageDto);
+        return supplierMapper.supplierListPage(page, supplierManageDto);
     }
 
     /**
      * 渚涘簲鍟嗗鍑�
+     *
      * @param response
      * @param supplierManageDto
      */
@@ -115,19 +136,19 @@
             ExcelUtil<SupplierManageExcelDto> util = new ExcelUtil<SupplierManageExcelDto>(SupplierManageExcelDto.class);
             List<SupplierManageExcelDto> list = util.importExcel(file.getInputStream());
             ArrayList<SupplierManage> supplierManages = new ArrayList<>();
-            list.stream().forEach(dto -> {
+            list.forEach(dto -> {
                 SupplierManage supplierManage = new SupplierManage();
-                BeanUtils.copyProperties(dto,supplierManage);
+                BeanUtils.copyProperties(dto, supplierManage);
                 supplierManage.setMaintainTime(LocalDate.now());
                 Long userId = SecurityUtils.getLoginUser().getUser().getUserId();
 
-                supplierManage.setMaintainUserId(Integer.parseInt(userId+""));
+                supplierManage.setMaintainUserId(Integer.parseInt(userId + ""));
                 supplierManages.add(supplierManage);
             });
 
             this.saveOrUpdateBatch(supplierManages);
             return true;
-        }catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
         }
         return false;
@@ -135,11 +156,221 @@
 
     @Override
     public IPage<SupplierTransactionsVo> supplierTransactions(Page page, String supplierName) {
-        return supplierMapper.supplierTransactions(page,supplierName);
+        IPage<SupplierTransactionsVo> plPage = supplierMapper.supplierTransactions(page, supplierName);
+        List<SupplierTransactionsVo> resultList = plPage.getRecords();
+        if (resultList.isEmpty()) {
+            return plPage;
+        }
+
+        List<Long> supplierIds = resultList.stream().map(SupplierTransactionsVo::getSupplierId).collect(Collectors.toList());
+
+        List<PurchaseLedger> purchaseLedgers = purchaseLedgerMapper.selectList(new LambdaQueryWrapper<PurchaseLedger>()
+                .in(PurchaseLedger::getSupplierId, supplierIds));
+
+        if (purchaseLedgers.isEmpty()) {
+            for (SupplierTransactionsVo vo : resultList) {
+                vo.setShippedAmount(BigDecimal.ZERO);
+                BigDecimal contractAmount = vo.getContractAmounts() == null ? BigDecimal.ZERO : vo.getContractAmounts();
+                vo.setUnshippedAmount(contractAmount);
+                AmountUtils.normalizeSupplierTransaction(vo);
+            }
+            return plPage;
+        }
+
+        List<Long> ledgerIds = purchaseLedgers.stream().map(PurchaseLedger::getId).collect(Collectors.toList());
+
+        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>()
+                .in(SalesLedgerProduct::getSalesLedgerId, ledgerIds)
+                .eq(SalesLedgerProduct::getType, 2));
+
+        //  涓嶈川妫�鐩存帴鍏ュ簱鐨� - 7
+        List<StockInRecord> directInboundRecords = stockInRecordMapper.selectList(new LambdaQueryWrapper<StockInRecord>()
+                .eq(StockInRecord::getRecordType, "7")
+                .eq(StockInRecord::getApprovalStatus, 1)
+                .in(StockInRecord::getRecordId, ledgerIds));
+
+        //  閫氳繃璐ㄦ鍏ュ簱鐨�
+        List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(new LambdaQueryWrapper<QualityInspect>()
+                .in(QualityInspect::getPurchaseLedgerId, ledgerIds));
+        List<Long> inspectIds = qualityInspects.stream().map(QualityInspect::getId).collect(Collectors.toList());
+
+        //  璐ㄦ鍚堟牸鍏ュ簱 - 10
+        List<StockInRecord> qualifiedInboundRecords = new ArrayList<>();
+        List<QualityUnqualified> qualityUnqualifieds = new ArrayList<>();
+        if (!inspectIds.isEmpty()) {
+            qualifiedInboundRecords = stockInRecordMapper.selectList(new LambdaQueryWrapper<StockInRecord>()
+                    .eq(StockInRecord::getRecordType, "10")
+                    .eq(StockInRecord::getApprovalStatus, 1)
+                    .in(StockInRecord::getRecordId, inspectIds));
+
+            qualityUnqualifieds = qualityUnqualifiedMapper.selectList(new LambdaQueryWrapper<QualityUnqualified>()
+                    .in(QualityUnqualified::getInspectId, inspectIds));
+        }
+        List<Long> unqualifiedIds = qualityUnqualifieds.stream().map(QualityUnqualified::getId).collect(Collectors.toList());
+
+        //  璐ㄦ涓嶅悎鏍煎叆搴� - 11
+        List<StockInRecord> unqualifiedInboundRecords = new ArrayList<>();
+        if (!unqualifiedIds.isEmpty()) {
+            unqualifiedInboundRecords = stockInRecordMapper.selectList(new LambdaQueryWrapper<StockInRecord>()
+                    .eq(StockInRecord::getRecordType, "11")
+                    .eq(StockInRecord::getApprovalStatus, 1)
+                    .in(StockInRecord::getRecordId, unqualifiedIds));
+        }
+
+        for (SupplierTransactionsVo vo : resultList) {
+            BigDecimal shippedAmount = BigDecimal.ZERO;
+
+            List<PurchaseLedger> currentLedgers = purchaseLedgers.stream().filter(pl -> pl.getSupplierId().equals(vo.getSupplierId())).toList();
+            for (PurchaseLedger ledger : currentLedgers) {
+                Long ledgerId = ledger.getId();
+
+                List<StockInRecord> currentDirectRecords = directInboundRecords.stream().filter(s -> s.getRecordId().equals(ledgerId)).toList();
+                for (StockInRecord sir : currentDirectRecords) {
+                    List<SalesLedgerProduct> currentProducts = salesLedgerProducts.stream().filter(s -> s.getSalesLedgerId().equals(ledgerId)).toList();
+                    for (SalesLedgerProduct slp : currentProducts) {
+                        if (sir.getStockInNum() != null && slp.getTaxInclusiveUnitPrice() != null) {
+                            shippedAmount = shippedAmount.add(sir.getStockInNum().multiply(slp.getTaxInclusiveUnitPrice()));
+                        }
+                    }
+                }
+
+                List<QualityInspect> currentInspects = qualityInspects.stream().filter(q -> q.getPurchaseLedgerId().equals(ledgerId)).toList();
+                for (QualityInspect inspect : currentInspects) {
+                    List<StockInRecord> currentQualifiedRecords = qualifiedInboundRecords.stream().filter(s -> s.getRecordId().equals(inspect.getId())).toList();
+                    for (StockInRecord sir : currentQualifiedRecords) {
+                        BigDecimal minPrice = getMinTaxInclusiveUnitPrice(salesLedgerProducts, ledgerId, sir.getProductModelId());
+                        if (sir.getStockInNum() != null && minPrice != null) {
+                            shippedAmount = shippedAmount.add(sir.getStockInNum().multiply(minPrice));
+                        }
+                    }
+
+                    List<QualityUnqualified> currentUnqualifieds = qualityUnqualifieds.stream().filter(q -> q.getInspectId().equals(inspect.getId())).toList();
+                    for (QualityUnqualified unqualified : currentUnqualifieds) {
+                        List<StockInRecord> currentUnqualifiedRecords = unqualifiedInboundRecords.stream().filter(s -> s.getRecordId().equals(unqualified.getId())).toList();
+                        for (StockInRecord sir : currentUnqualifiedRecords) {
+                            BigDecimal minPrice = getMinTaxInclusiveUnitPrice(salesLedgerProducts, ledgerId, sir.getProductModelId());
+                            if (sir.getStockInNum() != null && minPrice != null) {
+                                shippedAmount = shippedAmount.add(sir.getStockInNum().multiply(minPrice));
+                            }
+                        }
+                    }
+                }
+            }
+
+            BigDecimal contractAmount = vo.getContractAmounts() == null ? BigDecimal.ZERO : vo.getContractAmounts();
+            if (shippedAmount.subtract(contractAmount).compareTo(BigDecimal.ZERO) > 0) {
+                shippedAmount = contractAmount;
+            }
+            vo.setShippedAmount(shippedAmount);
+            vo.setUnshippedAmount(contractAmount.subtract(shippedAmount));
+            AmountUtils.normalizeSupplierTransaction(vo);
+        }
+
+        return plPage;
     }
 
     @Override
     public IPage<SupplierTransactionsDetailsVo> supplierTransactionsDetails(Page page, Long supplierId) {
-        return supplierMapper.supplierTransactionsDetails(page,supplierId);
+        IPage<SupplierTransactionsDetailsVo> plPage = supplierMapper.supplierTransactionsDetails(page, supplierId);
+
+        List<SupplierTransactionsDetailsVo> resultList = plPage.getRecords();
+        if (resultList.isEmpty()) {
+            return plPage;
+        }
+
+        List<Long> ledgerIds = resultList.stream().map(SupplierTransactionsDetailsVo::getPurchaseLedgerId).collect(Collectors.toList());
+
+        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>()
+                .in(SalesLedgerProduct::getSalesLedgerId, ledgerIds)
+                .eq(SalesLedgerProduct::getType, 2));
+
+        //  涓嶈川妫�鐩存帴鍏ュ簱鐨� - 7
+        List<StockInRecord> directInboundRecords = stockInRecordMapper.selectList(new LambdaQueryWrapper<StockInRecord>()
+                .eq(StockInRecord::getRecordType, "7")
+                .eq(StockInRecord::getApprovalStatus, 1)
+                .in(StockInRecord::getRecordId, ledgerIds));
+
+        //  閫氳繃璐ㄦ鍏ュ簱鐨�
+        List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(new LambdaQueryWrapper<QualityInspect>()
+                .in(QualityInspect::getPurchaseLedgerId, ledgerIds));
+        List<Long> inspectIds = qualityInspects.stream().map(QualityInspect::getId).collect(Collectors.toList());
+
+        //  璐ㄦ鍚堟牸鍏ュ簱 - 10
+        List<StockInRecord> qualifiedInboundRecords = new ArrayList<>();
+        List<QualityUnqualified> qualityUnqualifieds = new ArrayList<>();
+        if (!inspectIds.isEmpty()) {
+            qualifiedInboundRecords = stockInRecordMapper.selectList(new LambdaQueryWrapper<StockInRecord>()
+                    .eq(StockInRecord::getRecordType, "10")
+                    .eq(StockInRecord::getApprovalStatus, 1)
+                    .in(StockInRecord::getRecordId, inspectIds));
+
+            qualityUnqualifieds = qualityUnqualifiedMapper.selectList(new LambdaQueryWrapper<QualityUnqualified>()
+                    .in(QualityUnqualified::getInspectId, inspectIds));
+        }
+        List<Long> unqualifiedIds = qualityUnqualifieds.stream().map(QualityUnqualified::getId).collect(Collectors.toList());
+
+        //  璐ㄦ涓嶅悎鏍煎叆搴� - 11
+        List<StockInRecord> unqualifiedInboundRecords = new ArrayList<>();
+        if (!unqualifiedIds.isEmpty()) {
+            unqualifiedInboundRecords = stockInRecordMapper.selectList(new LambdaQueryWrapper<StockInRecord>()
+                    .eq(StockInRecord::getRecordType, "11")
+                    .eq(StockInRecord::getApprovalStatus, 1)
+                    .in(StockInRecord::getRecordId, unqualifiedIds));
+        }
+
+        for (SupplierTransactionsDetailsVo vo : resultList) {
+            BigDecimal shippedAmount = BigDecimal.ZERO;
+
+            List<StockInRecord> currentDirectRecords = directInboundRecords.stream().filter(s -> s.getRecordId().equals(vo.getPurchaseLedgerId())).toList();
+            for (StockInRecord sir : currentDirectRecords) {
+                List<SalesLedgerProduct> currentProducts = salesLedgerProducts.stream().filter(s -> s.getSalesLedgerId().equals(vo.getPurchaseLedgerId())).toList();
+                for (SalesLedgerProduct slp : currentProducts) {
+                    if (sir.getStockInNum() != null && slp.getTaxInclusiveUnitPrice() != null) {
+                        shippedAmount = shippedAmount.add(sir.getStockInNum().multiply(slp.getTaxInclusiveUnitPrice()));
+                    }
+                }
+            }
+
+            List<QualityInspect> currentInspects = qualityInspects.stream().filter(q -> q.getPurchaseLedgerId().equals(vo.getPurchaseLedgerId())).toList();
+            for (QualityInspect inspect : currentInspects) {
+                List<StockInRecord> currentQualifiedRecords = qualifiedInboundRecords.stream().filter(s -> s.getRecordId().equals(inspect.getId())).toList();
+                for (StockInRecord sir : currentQualifiedRecords) {
+                    BigDecimal minPrice = getMinTaxInclusiveUnitPrice(salesLedgerProducts, vo.getPurchaseLedgerId(), sir.getProductModelId());
+                    if (sir.getStockInNum() != null && minPrice != null) {
+                        shippedAmount = shippedAmount.add(sir.getStockInNum().multiply(minPrice));
+                    }
+                }
+
+                List<QualityUnqualified> currentUnqualifieds = qualityUnqualifieds.stream().filter(q -> q.getInspectId().equals(inspect.getId())).toList();
+                for (QualityUnqualified unqualified : currentUnqualifieds) {
+                    List<StockInRecord> currentUnqualifiedRecords = unqualifiedInboundRecords.stream().filter(s -> s.getRecordId().equals(unqualified.getId())).toList();
+                    for (StockInRecord sir : currentUnqualifiedRecords) {
+                        BigDecimal minPrice = getMinTaxInclusiveUnitPrice(salesLedgerProducts, vo.getPurchaseLedgerId(), sir.getProductModelId());
+                        if (sir.getStockInNum() != null && minPrice != null) {
+                            shippedAmount = shippedAmount.add(sir.getStockInNum().multiply(minPrice));
+                        }
+                    }
+                }
+            }
+
+            BigDecimal contractAmount = vo.getContractAmount() == null ? BigDecimal.ZERO : vo.getContractAmount();
+            if (shippedAmount.subtract(contractAmount).compareTo(BigDecimal.ZERO) > 0) {
+                shippedAmount = contractAmount;
+            }
+            vo.setShippedAmount(shippedAmount);
+            vo.setUnshippedAmount(contractAmount.subtract(shippedAmount));
+            AmountUtils.normalizeSupplierTransactionDetail(vo);
+        }
+
+        return plPage;
+    }
+
+    private BigDecimal getMinTaxInclusiveUnitPrice(List<SalesLedgerProduct> allSlp, Long salesLedgerId, Long productModelId) {
+        return allSlp.stream()
+                .filter(s -> s.getSalesLedgerId().equals(salesLedgerId) && s.getProductModelId() != null && s.getProductModelId().equals(productModelId))
+                .map(SalesLedgerProduct::getTaxInclusiveUnitPrice)
+                .filter(java.util.Objects::nonNull)
+                .min(BigDecimal::compareTo)
+                .orElse(null);
     }
 }
diff --git a/src/main/java/com/ruoyi/basic/vo/CustomerVo.java b/src/main/java/com/ruoyi/basic/vo/CustomerVo.java
index 0f72a2f..3d4c8cb 100644
--- a/src/main/java/com/ruoyi/basic/vo/CustomerVo.java
+++ b/src/main/java/com/ruoyi/basic/vo/CustomerVo.java
@@ -25,9 +25,4 @@
      * 鍏变韩鐢ㄦ埛ID瀛楃涓诧紙SQL鏌ヨ杩斿洖锛岀敤浜庤浆鎹负List锛�
      */
     private String userIdsStr;
-
-    /**
-     * 鏄惁琚攢鍞ā鍧楀紩鐢細0-鍚︼紝1-鏄�
-     */
-    private Integer salesReferenceFlag;
 }
diff --git a/src/main/java/com/ruoyi/basic/vo/ProductModelVo.java b/src/main/java/com/ruoyi/basic/vo/ProductModelVo.java
index cdcd893..bfe29c2 100644
--- a/src/main/java/com/ruoyi/basic/vo/ProductModelVo.java
+++ b/src/main/java/com/ruoyi/basic/vo/ProductModelVo.java
@@ -1,5 +1,6 @@
 package com.ruoyi.basic.vo;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.ruoyi.basic.pojo.ProductModel;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -10,5 +11,8 @@
 @Data
 public class ProductModelVo extends ProductModel {
 
+    @TableField(exist = false)
+    private String topProductName;
+
     private List<String> batchNoList;
 }
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/controller/DutyPlanController.java b/src/main/java/com/ruoyi/collaborativeApproval/controller/DutyPlanController.java
index d622e99..e9d29e7 100644
--- a/src/main/java/com/ruoyi/collaborativeApproval/controller/DutyPlanController.java
+++ b/src/main/java/com/ruoyi/collaborativeApproval/controller/DutyPlanController.java
@@ -7,6 +7,8 @@
 import com.ruoyi.collaborativeApproval.pojo.RulesRegulationsManagement;
 import com.ruoyi.collaborativeApproval.service.DutyPlanService;
 import com.ruoyi.common.utils.excel.ExcelUtils;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.AllArgsConstructor;
@@ -34,18 +36,21 @@
         return AjaxResult.success(dutyPlanService.getNum());
     }
 
+    @Log(title = "鏂板鍊肩彮璁″垝", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     @Operation(summary = "鏂板")
     public AjaxResult add(@RequestBody DutyPlan dutyPlan){
         return AjaxResult.success(dutyPlanService.save(dutyPlan));
     }
 
+    @Log(title = "淇敼鍊肩彮璁″垝", businessType = BusinessType.UPDATE)
     @PostMapping("/update")
     @Operation(summary = "淇敼")
     public AjaxResult update(@RequestBody DutyPlan dutyPlan){
         return AjaxResult.success(dutyPlanService.updateById(dutyPlan));
     }
 
+    @Log(title = "鍒犻櫎鍊肩彮璁″垝", businessType = BusinessType.DELETE)
     @DeleteMapping("/delete")
     @Operation(summary = "鍒犻櫎")
     public AjaxResult delete(@RequestBody List<Long> ids){
@@ -54,6 +59,7 @@
         }
         return AjaxResult.success(dutyPlanService.removeBatchByIds(ids));
     }
+    @Log(title = "瀵煎嚭鍊肩彮璁″垝", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     @Operation(summary = "瀵煎嚭")
     public void exportData(HttpServletResponse response, DutyPlanDTO dutyPlanDTO){
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/controller/MeetingController.java b/src/main/java/com/ruoyi/collaborativeApproval/controller/MeetingController.java
index 917bda6..716dbe7 100644
--- a/src/main/java/com/ruoyi/collaborativeApproval/controller/MeetingController.java
+++ b/src/main/java/com/ruoyi/collaborativeApproval/controller/MeetingController.java
@@ -13,6 +13,8 @@
 import com.ruoyi.collaborativeApproval.vo.SearchMeetingRoomVo;
 import com.ruoyi.collaborativeApproval.vo.SearchMeetingUseVo;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
@@ -42,6 +44,7 @@
         return R.ok(meetingService.getMeetingRoomList(vo));
     }
 
+    @Log(title = "鏂板浼氳瀹�", businessType = BusinessType.INSERT)
     @PostMapping("/saveRoom")
     public R saveRoom(@RequestBody MeetingRoom meetingRoom) {
         meetingService.saveMeetRoom(meetingRoom);
@@ -53,6 +56,7 @@
         return R.ok(meetingService.findMeetRoomById(id));
     }
 
+    @Log(title = "鍒犻櫎浼氳瀹�", businessType = BusinessType.DELETE)
     @DeleteMapping("/delRoom/{id}")
     public R deleteRoom(@PathVariable Long id) {
         meetingService.deleteMeetingRoom(id);
@@ -69,18 +73,21 @@
         return R.ok(meetingService.getMeetingDraftList(vo));
     }
 
+    @Log(title = "淇濆瓨浼氳鑽夌", businessType = BusinessType.INSERT)
     @PostMapping("/saveDraft")
     public R saveMeetingDraft(@RequestBody MeetDraft meetDraft) {
         meetingService.saveMeetDraft(meetDraft);
         return R.ok();
     }
 
+    @Log(title = "鍒犻櫎浼氳鑽夌", businessType = BusinessType.DELETE)
     @DeleteMapping("/delDraft/{id}")
     public R deleteMeetingDraft(@PathVariable Long id) {
         meetingService.deleteMeetingDraft(id);
         return R.ok();
     }
 
+    @Log(title = "鏂板浼氳鐢宠", businessType = BusinessType.INSERT)
     @PostMapping("/saveMeetingApplication")
     public R saveMeetApplication(@RequestBody MeetApplication meetApplication) {
        return meetingService.saveMeetApplication(meetApplication);
@@ -110,6 +117,7 @@
         return R.ok(meetingService.getMeetingMinutesById(id));
     }
 
+    @Log(title = "淇濆瓨浼氳绾", businessType = BusinessType.INSERT)
     @PostMapping("/saveMeetingMinutes")
     public R saveMeetingMinutes(@RequestBody MeetingMinutes meetingMinutes) {
         meetingService.saveMeetingMinutes(meetingMinutes);
@@ -127,6 +135,7 @@
     }
 
     @Operation(summary = "浼氳瀹よ缃鍑�")
+    @Log(title = "瀵煎嚭浼氳瀹よ缃�", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response) {
         List<MeetingRoom> accountExpenses = meetingService.list();
@@ -137,6 +146,7 @@
     private final MeetDraftMapper meetDraftMapper;
 
     @Operation(summary = "浼氳鑽夌瀵煎嚭")
+    @Log(title = "瀵煎嚭浼氳鑽夌", businessType = BusinessType.EXPORT)
     @PostMapping("/exportOne")
     public void exportOne(HttpServletResponse response) {
         List<MeetDraft> accountExpenses = meetDraftMapper.selectList(new LambdaQueryWrapper<MeetDraft>());
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/controller/NoticeTypeController.java b/src/main/java/com/ruoyi/collaborativeApproval/controller/NoticeTypeController.java
index dba3e77..9489dfa 100644
--- a/src/main/java/com/ruoyi/collaborativeApproval/controller/NoticeTypeController.java
+++ b/src/main/java/com/ruoyi/collaborativeApproval/controller/NoticeTypeController.java
@@ -5,6 +5,8 @@
 import com.ruoyi.basic.pojo.SupplierManage;
 import com.ruoyi.collaborativeApproval.pojo.NoticeType;
 import com.ruoyi.collaborativeApproval.service.NoticeTypeService;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import lombok.AllArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -33,6 +35,7 @@
      * @param noticeType
      * @return
      */
+    @Log(title = "鏂板鍏憡绫诲瀷", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public AjaxResult add(@RequestBody NoticeType noticeType) {
         return AjaxResult.success(noticeTypeService.saveOrUpdate(noticeType));
@@ -43,6 +46,7 @@
      * @param ids
      * @return
      */
+    @Log(title = "鍒犻櫎鍏憡绫诲瀷", businessType = BusinessType.DELETE)
     @DeleteMapping("/del")
     public AjaxResult delNoticeType(@RequestBody List<Integer> ids) {
         if(CollectionUtils.isEmpty(ids)){
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementController.java b/src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementController.java
index 5e59117..5cf7689 100644
--- a/src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementController.java
+++ b/src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementController.java
@@ -8,6 +8,8 @@
 import com.ruoyi.collaborativeApproval.pojo.SealApplicationManagement;
 import com.ruoyi.collaborativeApproval.service.RulesRegulationsManagementService;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
@@ -33,6 +35,7 @@
         return AjaxResult.success(rulesRegulationsManagementService.listPage(page, rulesRegulationsManagement));
     }
 
+    @Log(title = "鏂板瑙勭珷鍒跺害", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     @Operation(summary = "鏂板")
     public AjaxResult add(@RequestBody RulesRegulationsManagement rulesRegulationsManagement){
@@ -40,12 +43,14 @@
         return AjaxResult.success(rulesRegulationsManagement.getId());
     }
 
+    @Log(title = "淇敼瑙勭珷鍒跺害", businessType = BusinessType.UPDATE)
     @PostMapping("/update")
     @Operation(summary = "淇敼")
     public AjaxResult update(@RequestBody RulesRegulationsManagement rulesRegulationsManagement){
         return AjaxResult.success(rulesRegulationsManagementService.updateById(rulesRegulationsManagement));
     }
 
+    @Log(title = "鍒犻櫎瑙勭珷鍒跺害", businessType = BusinessType.DELETE)
     @DeleteMapping("/delete")
     @Operation(summary = "鍒犻櫎")
     public AjaxResult delete(@PathVariable("ids") List<Long> ids){
@@ -55,11 +60,13 @@
         return AjaxResult.success(rulesRegulationsManagementService.removeBatchByIds(ids));
     }
     //瑙勫垯鏌ョ湅鏃舵柊澧為槄璇荤姸鎬�
+    @Log(title = "鏂板闃呰鐘舵��", businessType = BusinessType.INSERT)
     @PostMapping("/addReadingStatus")
     @Operation(summary = "鏂板闃呰鐘舵��")
     public AjaxResult addReadingStatus(@RequestBody ReadingStatus readingStatus){
         return AjaxResult.success(readingStatusMapper.insert(readingStatus));
     }
+    @Log(title = "淇敼闃呰鐘舵��", businessType = BusinessType.UPDATE)
     @PostMapping("/updateReadingStatus")
     @Operation(summary = "淇敼闃呰鐘舵��")
     public AjaxResult updateReadingStatus(@RequestBody ReadingStatus readingStatus){
@@ -77,6 +84,7 @@
     }
 
     @Operation(summary = "瑙勭珷鍒跺害绠$悊瀵煎嚭")
+    @Log(title = "瀵煎嚭瑙勭珷鍒跺害", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response) {
         List<RulesRegulationsManagement> accountExpenses = rulesRegulationsManagementService.list();
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementFileController.java b/src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementFileController.java
index 3f770f8..59c19bc 100644
--- a/src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementFileController.java
+++ b/src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementFileController.java
@@ -3,6 +3,8 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.collaborativeApproval.pojo.RulesRegulationsManagementFile;
 import com.ruoyi.collaborativeApproval.service.RulesRegulationsManagementFileService;
+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.quality.pojo.QualityInspectFile;
 import com.ruoyi.quality.service.IQualityInspectFileService;
@@ -33,6 +35,7 @@
      * @param rulesRegulationsManagementFile
      * @return
      */
+    @Log(title = "瑙勭珷鍒跺害鏂囦欢", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public AjaxResult add(@RequestBody RulesRegulationsManagementFile rulesRegulationsManagementFile) {
         return AjaxResult.success(rulesRegulationsManagementFileService.save(rulesRegulationsManagementFile));
@@ -43,6 +46,7 @@
      * @param ids
      * @return
      */
+    @Log(title = "瑙勭珷鍒跺害鏂囦欢", businessType = BusinessType.DELETE)
     @DeleteMapping("/del")
     public AjaxResult delQualityUnqualified(@RequestBody List<Integer> ids) {
         if(CollectionUtils.isEmpty(ids)){
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/controller/SealApplicationManagementController.java b/src/main/java/com/ruoyi/collaborativeApproval/controller/SealApplicationManagementController.java
index dc6a64e..1b6ea12 100644
--- a/src/main/java/com/ruoyi/collaborativeApproval/controller/SealApplicationManagementController.java
+++ b/src/main/java/com/ruoyi/collaborativeApproval/controller/SealApplicationManagementController.java
@@ -10,6 +10,7 @@
 import com.ruoyi.collaborativeApproval.service.SealApplicationManagementService;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.project.system.service.ISysNoticeService;
@@ -39,6 +40,7 @@
         return AjaxResult.success(sealApplicationManagementService.listPage(page,sealApplicationManagement));
     }
 
+    @Log(title = "鐢ㄧ珷鐢宠", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     @Operation(summary = "鏂板")
     public AjaxResult add(@RequestBody SealApplicationManagementDTO sealApplicationManagement){
@@ -57,6 +59,7 @@
         return AjaxResult.success();
     }
 
+    @Log(title = "鐢ㄧ珷鐢宠", businessType = BusinessType.UPDATE)
     @PostMapping("/update")
     @Operation(summary = "淇敼")
     public AjaxResult update(@RequestBody SealApplicationManagementDTO sealApplicationManagement){
@@ -68,6 +71,7 @@
         return AjaxResult.success(sealApplicationManagementService.updateById(sealApplicationManagement));
     }
 
+    @Log(title = "鐢ㄧ珷鐢宠", businessType = BusinessType.DELETE)
     @DeleteMapping("/delete")
     @Operation(summary = "鍒犻櫎")
     public AjaxResult delete(@PathVariable("ids") List<Long> ids){
@@ -80,6 +84,7 @@
         return AjaxResult.success(sealApplicationManagementService.removeBatchByIds(ids));
     }
 
+    @Log(title = "鐢ㄧ珷鐢宠", businessType = BusinessType.EXPORT)
     @Operation(summary = "鐢ㄥ嵃鐢宠绠$悊瀵煎嚭")
     @PostMapping("/export")
     public void export(HttpServletResponse response) {
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/controller/StaffContactsPersonalController.java b/src/main/java/com/ruoyi/collaborativeApproval/controller/StaffContactsPersonalController.java
index 3673208..8264252 100644
--- a/src/main/java/com/ruoyi/collaborativeApproval/controller/StaffContactsPersonalController.java
+++ b/src/main/java/com/ruoyi/collaborativeApproval/controller/StaffContactsPersonalController.java
@@ -4,6 +4,8 @@
 import com.ruoyi.collaborativeApproval.dto.StaffContactsPersonalDTO;
 import com.ruoyi.collaborativeApproval.pojo.StaffContactsPersonal;
 import com.ruoyi.collaborativeApproval.service.StaffContactsPersonalService;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.AllArgsConstructor;
@@ -21,12 +23,14 @@
         return AjaxResult.success(staffContactsPersonalService.listPage(page, staffContactsPersonalDTO));
     }
 
+    @Log(title = "鏂板鍛樺伐閫氳褰�", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     @Operation(summary = "鏂板")
     public AjaxResult add(@RequestBody StaffContactsPersonal staffContactsPersonal) {
         return AjaxResult.success(staffContactsPersonalService.save(staffContactsPersonal));
     }
 
+    @Log(title = "鍒犻櫎鍛樺伐閫氳褰�", businessType = BusinessType.DELETE)
     @DeleteMapping("/delete/{id}")
     @Operation(summary = "鍒犻櫎")
     public AjaxResult delete(@PathVariable("id") Long id) {
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/service/impl/MeetingServiceImpl.java b/src/main/java/com/ruoyi/collaborativeApproval/service/impl/MeetingServiceImpl.java
index baa8d02..636130a 100644
--- a/src/main/java/com/ruoyi/collaborativeApproval/service/impl/MeetingServiceImpl.java
+++ b/src/main/java/com/ruoyi/collaborativeApproval/service/impl/MeetingServiceImpl.java
@@ -238,9 +238,9 @@
                     .or()
                     .eq(MeetApplication::getApplicationType, "notification");
         });
-        if (Objects.nonNull(vo.getDate())) {
+        if (Objects.nonNull(vo.getMeetingDate())) {
             alWrapper.and(wrapper -> {
-                wrapper.eq(MeetApplication::getMeetingDate, vo.getDate());
+                wrapper.eq(MeetApplication::getMeetingDate, vo.getMeetingDate());
             });
         }
         alWrapper.orderByAsc(MeetApplication::getStartTime);
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/vo/SearchMeetingUseVo.java b/src/main/java/com/ruoyi/collaborativeApproval/vo/SearchMeetingUseVo.java
index 6676876..a782b19 100644
--- a/src/main/java/com/ruoyi/collaborativeApproval/vo/SearchMeetingUseVo.java
+++ b/src/main/java/com/ruoyi/collaborativeApproval/vo/SearchMeetingUseVo.java
@@ -16,6 +16,4 @@
     @JsonFormat(pattern = "yyyy-MM-dd")
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     private Date meetingDate;
-
-    private String date;
 }
diff --git a/src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java b/src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java
index a27680a..ccc6d78 100644
--- a/src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java
+++ b/src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java
@@ -7,6 +7,7 @@
 public enum StockOutQualifiedRecordTypeEnum implements BaseEnum<String> {
     CUSTOMIZATION_STOCK_OUT("1", "鍚堟牸鑷畾涔夊嚭搴�"),
     PRODUCTION_REPORT_STOCK_OUT("3", "鐢熶骇鎶ュ伐-鍑哄簱"),
+    SALE_STOCK_OUT("8", "閿�鍞�-鍑哄簱"),
     PURCHASE_RETURN_STOCK_OUT("9", "閲囪喘閫�璐�"),
     CUSTOMIZATION_UNSTOCK_OUT("10", "涓嶅悎鏍艰嚜瀹氫箟鍑哄簱"),
     SALE_SHIP_STOCK_OUT("13", "閿�鍞�-鍙戣揣鍑哄簱"),
diff --git a/src/main/java/com/ruoyi/common/utils/AmountUtils.java b/src/main/java/com/ruoyi/common/utils/AmountUtils.java
new file mode 100644
index 0000000..7155fc6
--- /dev/null
+++ b/src/main/java/com/ruoyi/common/utils/AmountUtils.java
@@ -0,0 +1,124 @@
+package com.ruoyi.common.utils;
+
+import com.ruoyi.purchase.dto.ProcurementBusinessSummaryDto;
+import com.ruoyi.purchase.vo.SupplierTransactionsDetailsVo;
+import com.ruoyi.purchase.vo.SupplierTransactionsVo;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
+import com.ruoyi.sales.vo.CustomerTransactionsDetailsVo;
+import com.ruoyi.sales.vo.CustomerTransactionsVo;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 閲戦绮惧害宸ュ叿锛氱粺涓�淇濈暀 6 浣嶅皬鏁�
+ */
+public final class AmountUtils {
+
+    public static final int AMOUNT_SCALE = 6;
+    public static final RoundingMode AMOUNT_ROUNDING = RoundingMode.HALF_UP;
+
+    private AmountUtils() {
+    }
+
+    public static BigDecimal scaleAmount(BigDecimal value) {
+        if (value == null) {
+            return BigDecimal.ZERO.setScale(AMOUNT_SCALE, AMOUNT_ROUNDING);
+        }
+        return value.setScale(AMOUNT_SCALE, AMOUNT_ROUNDING);
+    }
+
+    public static BigDecimal calcTaxExclusiveTotalPrice(BigDecimal taxInclusiveTotalPrice, BigDecimal taxRate) {
+        if (taxInclusiveTotalPrice == null || taxRate == null) {
+            return scaleAmount(BigDecimal.ZERO);
+        }
+        BigDecimal divisor = BigDecimal.ONE.add(
+                taxRate.divide(BigDecimal.valueOf(100), AMOUNT_SCALE, AMOUNT_ROUNDING)
+        );
+        return scaleAmount(taxInclusiveTotalPrice.divide(divisor, AMOUNT_SCALE, AMOUNT_ROUNDING));
+    }
+
+    public static void normalizeSalesLedgerProduct(SalesLedgerProduct product) {
+        if (product == null) {
+            return;
+        }
+        product.setTaxInclusiveUnitPrice(scaleAmount(product.getTaxInclusiveUnitPrice()));
+        product.setTaxInclusiveTotalPrice(scaleAmount(product.getTaxInclusiveTotalPrice()));
+        product.setTaxExclusiveTotalPrice(scaleAmount(product.getTaxExclusiveTotalPrice()));
+    }
+
+    public static void normalizeSalesLedgerProducts(Collection<SalesLedgerProduct> products) {
+        if (products == null) {
+            return;
+        }
+        products.forEach(AmountUtils::normalizeSalesLedgerProduct);
+    }
+
+    public static void normalizeContractAmount(Object entity) {
+        if (entity == null) {
+            return;
+        }
+        try {
+            java.lang.reflect.Field field = entity.getClass().getDeclaredField("contractAmount");
+            field.setAccessible(true);
+            field.set(entity, scaleAmount((BigDecimal) field.get(entity)));
+        } catch (NoSuchFieldException ignored) {
+        } catch (Exception e) {
+            throw new RuntimeException("鏍囧噯鍖栧悎鍚岄噾棰濆け璐�", e);
+        }
+    }
+
+    public static void normalizeSupplierTransaction(SupplierTransactionsVo vo) {
+        if (vo == null) {
+            return;
+        }
+        vo.setContractAmounts(scaleAmount(vo.getContractAmounts()));
+        vo.setShippedAmount(scaleAmount(vo.getShippedAmount()));
+        vo.setUnshippedAmount(scaleAmount(vo.getUnshippedAmount()));
+    }
+
+    public static void normalizeSupplierTransactionDetail(SupplierTransactionsDetailsVo vo) {
+        if (vo == null) {
+            return;
+        }
+        vo.setContractAmount(scaleAmount(vo.getContractAmount()));
+        vo.setShippedAmount(scaleAmount(vo.getShippedAmount()));
+        vo.setUnshippedAmount(scaleAmount(vo.getUnshippedAmount()));
+    }
+
+    public static void normalizeCustomerTransaction(CustomerTransactionsVo vo) {
+        if (vo == null) {
+            return;
+        }
+        vo.setContractAmounts(scaleAmount(vo.getContractAmounts()));
+        vo.setShippedAmount(scaleAmount(vo.getShippedAmount()));
+        vo.setUnshippedAmount(scaleAmount(vo.getUnshippedAmount()));
+    }
+
+    public static void normalizeCustomerTransactionDetail(CustomerTransactionsDetailsVo vo) {
+        if (vo == null) {
+            return;
+        }
+        vo.setContractAmount(scaleAmount(vo.getContractAmount()));
+        vo.setShippedAmount(scaleAmount(vo.getShippedAmount()));
+        vo.setUnshippedAmount(scaleAmount(vo.getUnshippedAmount()));
+    }
+
+    public static void normalizeProcurementBusinessSummary(ProcurementBusinessSummaryDto dto) {
+        if (dto == null) {
+            return;
+        }
+        dto.setPurchaseAmount(scaleAmount(dto.getPurchaseAmount()));
+        dto.setAveragePrice(scaleAmount(dto.getAveragePrice()));
+        dto.setReturnAmount(scaleAmount(dto.getReturnAmount()));
+    }
+
+    public static void normalizeProcurementBusinessSummaryList(List<ProcurementBusinessSummaryDto> list) {
+        if (list == null) {
+            return;
+        }
+        list.forEach(AmountUtils::normalizeProcurementBusinessSummary);
+    }
+}
diff --git a/src/main/java/com/ruoyi/common/utils/DateUtils.java b/src/main/java/com/ruoyi/common/utils/DateUtils.java
index f0b14f9..0fa7e5a 100644
--- a/src/main/java/com/ruoyi/common/utils/DateUtils.java
+++ b/src/main/java/com/ruoyi/common/utils/DateUtils.java
@@ -3,13 +3,17 @@
 import java.lang.management.ManagementFactory;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.time.*;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
 import java.util.Date;
 import org.apache.commons.lang3.time.DateFormatUtils;
 
 /**
  * 鏃堕棿宸ュ叿绫�
- *
+ * 
  * @author ruoyi
  */
 public class DateUtils extends org.apache.commons.lang3.time.DateUtils
@@ -25,13 +29,13 @@
     public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
 
     private static String[] parsePatterns = {
-            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
+            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", 
             "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
             "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
 
     /**
      * 鑾峰彇褰撳墠Date鍨嬫棩鏈�
-     *
+     * 
      * @return Date() 褰撳墠鏃ユ湡
      */
     public static Date getNowDate()
@@ -41,15 +45,16 @@
 
     public static LocalDate toLocalDate(Date date){
         if(date == null) return LocalDate.now();
-        // java.sql.Date.toInstant() 浼氭姏 UnsupportedOperationException锛岄渶鍏堣浆涓� java.util.Date
-        Instant instant = new java.util.Date(date.getTime()).toInstant();
-        return instant.atZone(ZoneId.of("Asia/Shanghai"))
+        // 2. 鎸囧畾鍥哄畾鏃跺尯杞崲锛堝涓滃叓鍖篣TC+8銆乁TC闆舵椂鍖猴級
+        return date.toInstant()
+                .atZone(ZoneId.of("Asia/Shanghai")) // 涓滃叓鍖猴紙鍖椾含/涓婃捣鏃跺尯锛�
+                // .atZone(ZoneId.of("UTC")) // 鍙�夛細UTC闆舵椂鍖�
                 .toLocalDate();
     }
 
     /**
      * 鑾峰彇褰撳墠鏃ユ湡, 榛樿鏍煎紡涓簓yyy-MM-dd
-     *
+     * 
      * @return String
      */
     public static String getDate()
diff --git a/src/main/java/com/ruoyi/common/utils/OrderUtils.java b/src/main/java/com/ruoyi/common/utils/OrderUtils.java
index 6f47375..a110ec9 100644
--- a/src/main/java/com/ruoyi/common/utils/OrderUtils.java
+++ b/src/main/java/com/ruoyi/common/utils/OrderUtils.java
@@ -61,11 +61,8 @@
      * @param <T> 瀹炰綋绫诲瀷
      * @return 璁㈠崟缂栧彿
      */
-    public static <T> String countTodayByCreateTime(BaseMapper<T> mapper,String preFix,String code, LocalDateTime createTime) {
-        if (createTime == null) {
-            createTime = LocalDateTime.now();
-        }
-        LocalDate today = createTime.toLocalDate();
+    public static <T> String countTodayByCreateTime(BaseMapper<T> mapper,String preFix,String code) {
+        LocalDate today = LocalDate.now();
         LocalDateTime todayStart = today.atStartOfDay();
         LocalDateTime tomorrowStart = today.plusDays(1).atStartOfDay();
         String dateStr = today.format(DateTimeFormatter.BASIC_ISO_DATE);
@@ -112,17 +109,13 @@
      * @param <T> 瀹炰綋绫绘硾鍨�
      * @return 褰撳ぉ璁板綍鏁伴噺
      */
-    public static <T> String countAfterServiceTodayByCreateTime(BaseMapper<T> mapper,String preFix, LocalDateTime createTime) {
-        if (createTime == null) {
-            createTime = LocalDateTime.now();
-        }
-        LocalDate localDate = createTime.toLocalDate();
+    public static <T> String countAfterServiceTodayByCreateTime(BaseMapper<T> mapper,String preFix) {
         LocalDateTime todayStart = LocalDateTime.of(
-                localDate,
+                LocalDateTime.now().toLocalDate(),
                 LocalTime.MIN
         );
         LocalDateTime todayEnd = LocalDateTime.of(
-                localDate,
+                LocalDateTime.now().toLocalDate(),
                 LocalTime.MAX
         );
 
@@ -134,6 +127,6 @@
                 .lt("create_time", endDate);
 
         Long aLong = mapper.selectCount(queryWrapper);
-        return preFix + localDate.format(DateTimeFormatter.ISO_LOCAL_DATE).replaceAll("-", "") + String.format("%03d", (aLong + 1));
+        return preFix + LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE).replaceAll("-", "") + String.format("%03d", (aLong + 1));
     }
 }
diff --git a/src/main/java/com/ruoyi/customervisits/service/impl/CustomerVisitsServiceImpl.java b/src/main/java/com/ruoyi/customervisits/service/impl/CustomerVisitsServiceImpl.java
index 55c00b9..2e0a0b0 100644
--- a/src/main/java/com/ruoyi/customervisits/service/impl/CustomerVisitsServiceImpl.java
+++ b/src/main/java/com/ruoyi/customervisits/service/impl/CustomerVisitsServiceImpl.java
@@ -37,7 +37,7 @@
                 wrapper.like(CustomerVisits::getVisitingPeople, customerVisits.getVisitingPeople());
             }
         }
-        wrapper.orderByDesc(CustomerVisits::getId);
+
         return customerVisitsMapper.selectPage(page, wrapper);
     }
 
diff --git a/src/main/java/com/ruoyi/device/controller/DeviceDefectRecordController.java b/src/main/java/com/ruoyi/device/controller/DeviceDefectRecordController.java
index 1fd1c04..8424f60 100644
--- a/src/main/java/com/ruoyi/device/controller/DeviceDefectRecordController.java
+++ b/src/main/java/com/ruoyi/device/controller/DeviceDefectRecordController.java
@@ -4,6 +4,8 @@
 import com.ruoyi.device.dto.DeviceDefectRecordDto;
 import com.ruoyi.device.pojo.DeviceDefectRecord;
 import com.ruoyi.device.service.DeviceDefectRecordService;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
@@ -29,16 +31,19 @@
         return AjaxResult.success(deviceDefectRecordService.listPage(new Page<>(1,-1),deviceDefectRecordDto));
     }
 
+    @Log(title = "鏂板璁惧缂洪櫡璁板綍", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     @Operation(summary = "娣诲姞璁惧缂洪櫡璁板綍")
     public AjaxResult add(@RequestBody DeviceDefectRecord deviceDefectRecord) {
         return AjaxResult.success(deviceDefectRecordService.add(deviceDefectRecord));
     }
+    @Log(title = "淇敼璁惧缂洪櫡璁板綍", businessType = BusinessType.UPDATE)
     @PostMapping("/update")
     @Operation(summary = "淇敼璁惧缂洪櫡璁板綍")
     public AjaxResult update(@RequestBody DeviceDefectRecord deviceDefectRecord) {
         return AjaxResult.success(deviceDefectRecordService.updateByDDR(deviceDefectRecord));
     }
+    @Log(title = "鍒犻櫎璁惧缂洪櫡璁板綍", businessType = BusinessType.DELETE)
     @DeleteMapping("/delete")
     @Operation(summary = "鍒犻櫎璁惧缂洪櫡璁板綍")
     public AjaxResult delete(@PathVariable Long id) {
diff --git a/src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java b/src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java
index 298980e..824ef6b 100644
--- a/src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java
+++ b/src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java
@@ -12,6 +12,8 @@
 import com.ruoyi.device.pojo.DeviceMaintenance;
 import com.ruoyi.device.service.IDeviceLedgerService;
 import com.ruoyi.framework.aspectj.lang.annotation.Anonymous;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
@@ -41,6 +43,7 @@
         return AjaxResult.success(deviceLedgerService.queryPage(page, deviceLedger));
     }
 
+    @Log(title = "鏂板璁惧鍙拌处", businessType = BusinessType.INSERT)
     @PostMapping()
     @Operation(summary = "娣诲姞璁惧鍙拌处")
     public AjaxResult add(@RequestBody DeviceLedgerDto deviceLedgerDto) {
@@ -54,12 +57,14 @@
         return AjaxResult.success(deviceLedgerDto);
     }
 
+    @Log(title = "淇敼璁惧鍙拌处", businessType = BusinessType.UPDATE)
     @PutMapping()
     @Operation(summary = "淇敼璁惧鍙拌处")
     public AjaxResult update(@RequestBody DeviceLedgerDto deviceLedgerDto) {
         return deviceLedgerService.updateDeviceLedger(deviceLedgerDto);
     }
 
+    @Log(title = "鍒犻櫎璁惧鍙拌处", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     @Operation(summary = "鍒犻櫎璁惧鍙拌处")
     public AjaxResult delete(@PathVariable("ids") ArrayList<Long> ids) {
@@ -70,12 +75,14 @@
         return AjaxResult.success();
     }
 
+    @Log(title = "瀵煎嚭璁惧鍙拌处", businessType = BusinessType.EXPORT)
     @PostMapping("export")
     @Operation(summary = "瀵煎嚭璁惧鍙拌处")
     public void export(HttpServletResponse response, Long[] ids) {
         deviceLedgerService.export(response, ids);
     }
 
+    @Log(title = "涓嬭浇璁惧鍙拌处妯℃澘", businessType = BusinessType.EXPORT)
     @Operation(summary = "涓嬭浇妯℃澘")
     @PostMapping("/downloadTemplate")
     public void downloadTemplate(HttpServletResponse response) {
@@ -83,6 +90,7 @@
         util.importTemplateExcel(response, "璁惧瀵煎叆妯℃澘");
     }
 
+    @Log(title = "瀵煎叆璁惧鍙拌处", businessType = BusinessType.IMPORT)
     @PostMapping("/import")
     @Operation(summary = "瀵煎叆璁惧鍙拌处")
     public AjaxResult importData(MultipartFile file) throws IOException {
diff --git a/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java b/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java
index e34fc37..51cef45 100644
--- a/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java
+++ b/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java
@@ -7,6 +7,8 @@
 import com.ruoyi.device.pojo.DeviceMaintenance;
 import com.ruoyi.device.service.IDeviceLedgerService;
 import com.ruoyi.device.service.IDeviceMaintenanceService;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
@@ -32,6 +34,7 @@
         return AjaxResult.success(deviceMaintenanceService.queryPage(page,deviceMaintenanceDto));
     }
 
+    @Log(title = "鏂板璁惧淇濆吇", businessType = BusinessType.INSERT)
     @PostMapping()
     @Operation(summary = "娣诲姞璁惧淇濆吇")
     public AjaxResult add(@RequestBody DeviceMaintenanceDto deviceMaintenance) {
@@ -47,6 +50,7 @@
         return AjaxResult.success(deviceMaintenanceService.detailById(id));
     }
 
+    @Log(title = "淇敼璁惧淇濆吇", businessType = BusinessType.UPDATE)
     @PutMapping ()
     @Operation(summary = "淇敼璁惧淇濆吇")
     public AjaxResult update(@RequestBody DeviceMaintenanceDto deviceMaintenance) {
@@ -56,6 +60,7 @@
         return deviceMaintenanceService.updateDeviceDeviceMaintenance(deviceMaintenance);
     }
 
+    @Log(title = "鎵ц璁惧淇濆吇", businessType = BusinessType.UPDATE)
     @PostMapping ("maintenance")
     @Operation(summary = "淇敼璁惧淇濆吇")
     public AjaxResult maintenance(@RequestBody DeviceMaintenanceDto deviceMaintenance) {
@@ -63,6 +68,7 @@
     }
 
 
+    @Log(title = "鍒犻櫎璁惧淇濆吇", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     @Operation(summary = "鍒犻櫎璁惧淇濆吇")
     public AjaxResult delete(@PathVariable("ids") Long[] ids) {
@@ -73,6 +79,7 @@
         return AjaxResult.success();
     }
 
+    @Log(title = "瀵煎嚭璁惧淇濆吇", businessType = BusinessType.EXPORT)
     @PostMapping("export")
     @Operation(summary = "瀵煎嚭璁惧淇濆吇")
     public void export(HttpServletResponse response, Long[] ids) {
diff --git a/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceFileController.java b/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceFileController.java
index d92d334..8c077ba 100644
--- a/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceFileController.java
+++ b/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceFileController.java
@@ -4,6 +4,8 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.device.pojo.DeviceMaintenanceFile;
 import com.ruoyi.device.service.DeviceMaintenanceFileService;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.util.CollectionUtils;
@@ -34,6 +36,7 @@
      * @param deviceMaintenanceFile
      * @return
      */
+    @Log(title = "鏂板璁惧淇濆吇闄勪欢", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public AjaxResult add(@RequestBody DeviceMaintenanceFile deviceMaintenanceFile) {
         return AjaxResult.success(deviceMaintenanceFileService.save(deviceMaintenanceFile));
@@ -44,6 +47,7 @@
      * @param ids
      * @return
      */
+    @Log(title = "鍒犻櫎璁惧淇濆吇闄勪欢", businessType = BusinessType.DELETE)
     @DeleteMapping("/del")
     public AjaxResult delQualityUnqualified(@RequestBody List<Integer> ids) {
         if(CollectionUtils.isEmpty(ids)){
diff --git a/src/main/java/com/ruoyi/device/controller/DeviceRepairController.java b/src/main/java/com/ruoyi/device/controller/DeviceRepairController.java
index 7df7c26..ace3b17 100644
--- a/src/main/java/com/ruoyi/device/controller/DeviceRepairController.java
+++ b/src/main/java/com/ruoyi/device/controller/DeviceRepairController.java
@@ -5,6 +5,8 @@
 import com.ruoyi.device.dto.DeviceRepairDto;
 import com.ruoyi.device.pojo.DeviceRepair;
 import com.ruoyi.device.service.IDeviceRepairService;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
@@ -28,6 +30,7 @@
         return AjaxResult.success(deviceRepairService.queryPage(page,deviceRepairDto));
     }
 
+    @Log(title = "鏂板璁惧鎶ヤ慨", businessType = BusinessType.INSERT)
     @PostMapping()
     @Operation(summary = "娣诲姞璁惧鎶ヤ慨")
     public AjaxResult add( @RequestBody DeviceRepairDto deviceRepairDto) {
@@ -40,24 +43,28 @@
         return AjaxResult.success(deviceRepairService.detailById(id));
     }
 
+    @Log(title = "淇敼璁惧鎶ヤ慨", businessType = BusinessType.UPDATE)
     @PutMapping ()
     @Operation(summary = "淇敼璁惧鎶ヤ慨")
     public AjaxResult update( @RequestBody DeviceRepairDto deviceRepairDto) {
         return deviceRepairService.updateDeviceRepair(deviceRepairDto);
     }
 
+    @Log(title = "璁惧缁翠慨", businessType = BusinessType.UPDATE)
     @PostMapping ("/repair")
     @Operation(summary = "璁惧缁翠慨")
     public AjaxResult repair( @RequestBody DeviceRepairDto deviceRepairDto) {
         return deviceRepairService.confirmRepair(deviceRepairDto);
     }
 
+    @Log(title = "璁惧鎶ヤ慨楠屾敹", businessType = BusinessType.UPDATE)
     @PostMapping ("/acceptance")
     @Operation(summary = "璁惧鎶ヤ慨楠屾敹瀹℃壒")
     public AjaxResult acceptance(@RequestBody DeviceRepairDto deviceRepairDto) {
         return deviceRepairService.approveRepairAcceptance(deviceRepairDto);
     }
 
+    @Log(title = "鍒犻櫎璁惧鎶ヤ慨", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     @Operation(summary = "鍒犻櫎璁惧鎶ヤ慨")
     public AjaxResult delete(@PathVariable("ids") Long[] ids) {
@@ -68,6 +75,7 @@
         return AjaxResult.success();
     }
 
+    @Log(title = "瀵煎嚭璁惧鎶ヤ慨", businessType = BusinessType.EXPORT)
     @PostMapping("export")
     @Operation(summary = "瀵煎嚭璁惧鎶ヤ慨")
     public void export(HttpServletResponse response, Long[] ids) {
diff --git a/src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java b/src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java
index 350a09d..3fedf2c 100644
--- a/src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java
+++ b/src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java
@@ -62,8 +62,8 @@
     @Schema(description = "鏈�鍚庢墽琛屾椂闂�")
     private LocalDateTime lastExecutionTime;
 
-    @Schema(description = "鏄惁婵�娲�")
-    private boolean isActive;
+    @Schema(description = "鏄惁婵�娲�, 1=鍚敤, 0=鍋滅敤")
+    private Integer isActive;
 
     @Schema(description = "澶囨敞")
     @Excel(name = "澶囨敞")
diff --git a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java
index ec7a8e3..3913b8b 100644
--- a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java
+++ b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java
@@ -25,13 +25,25 @@
     private final Scheduler scheduler;
 
     /**
-     * 娣诲姞鏂颁换鍔″埌璋冨害鍣�
+     * 娣诲姞鎴栨洿鏂颁换鍔″埌璋冨害鍣�
      */
     public void scheduleMaintenanceTask(MaintenanceTask task){
         try {
             JobDetail jobDetail = buildJobDetail(task);
             Trigger trigger = buildJobTrigger(task, jobDetail);
-            scheduler.scheduleJob(jobDetail, trigger);
+
+            // 妫�鏌ヨЕ鍙戝櫒鏄惁宸插瓨鍦�
+            TriggerKey triggerKey = trigger.getKey();
+            Trigger existingTrigger = scheduler.getTrigger(triggerKey);
+
+            if (existingTrigger != null) {
+                // 瑙﹀彂鍣ㄥ凡瀛樺湪锛屾洿鏂板畠
+                scheduler.rescheduleJob(triggerKey, trigger);
+            } else {
+                // 瑙﹀彂鍣ㄤ笉瀛樺湪锛屽厛纭繚 Job 瀛樺湪锛岀劧鍚庤皟搴﹁Е鍙戝櫒
+                scheduler.addJob(jobDetail, true);
+                scheduler.scheduleJob(trigger);
+            }
         }catch (SchedulerException e){
             log.error("SchedulerException scheduleMaintenanceTask ERROR",e);
             throw new RuntimeException(e);
@@ -45,26 +57,41 @@
        try{
            TriggerKey triggerKey = new TriggerKey("triggerMaintenanceTask_" + task.getId());
 
-           // 鑾峰彇鐜版湁瑙﹀彂鍣ㄥ苟杞崲涓� CronTrigger
+           // 鑾峰彇鐜版湁瑙﹀彂鍣�
            Trigger oldTrigger = scheduler.getTrigger(triggerKey);
+
+           // 鏋勫缓鏂扮殑 JobDetail 鍜� Trigger
+           JobDetail jobDetail = buildJobDetail(task);
+           Trigger newTrigger = buildJobTrigger(task, jobDetail);
+
+           if (oldTrigger == null) {
+               // 瑙﹀彂鍣ㄤ笉瀛樺湪锛岃鏄庝换鍔′箣鍓嶈鍒犻櫎杩�
+               // 鍏堢‘淇� Job 瀛樺湪锛岀劧鍚庤皟搴﹁Е鍙戝櫒
+               scheduler.addJob(jobDetail, true);
+               scheduler.scheduleJob(newTrigger);
+               return;
+           }
+
+           // 瑙﹀彂鍣ㄥ瓨鍦紝鐩存帴鏇存柊
            if (!(oldTrigger instanceof CronTrigger)) {
                throw new SchedulerException("Existing trigger is not a CronTrigger");
            }
 
-           // 3. 鏋勫缓CronTrigger锛岀‘淇濇寔涔呭寲閰嶇疆
-           CronTrigger newTrigger = TriggerBuilder.newTrigger()
-                   .withIdentity(triggerKey)                // 鍞竴鏍囪瘑锛岀敤浜庢寔涔呭寲瀛樺偍
-                   .withDescription(task.getTaskName() + "_TRIGGER") // 瑙﹀彂鍣ㄦ弿杩�
-                   .forJob(oldTrigger.getJobKey())                       // 鍏宠仈瀵瑰簲鐨凧ob
+           // 鏋勫缓鏂扮殑 CronTrigger
+           CronTrigger cronTrigger = TriggerBuilder.newTrigger()
+                   .withIdentity(triggerKey)
+                   .withDescription(task.getTaskName() + "_TRIGGER")
+                   .forJob(oldTrigger.getJobKey())
                    .withSchedule(CronScheduleBuilder
-                           .cronSchedule(convertToCronExpression(task)) // 閿欒繃鎵ц鏃剁殑绛栫暐锛堟牴鎹笟鍔¤皟鏁达級
+                           .cronSchedule(convertToCronExpression(task))
+                           .withMisfireHandlingInstructionDoNothing()
                    )
-                   // 4. 璁剧疆寮�濮嬫椂闂达紙鑻ヤ负null鍒欑珛鍗崇敓鏁堬級
                    .startAt(task.getNextExecutionTime() != null
                            ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())
                            : new Date())
                    .build();
-           scheduler.rescheduleJob(triggerKey, newTrigger);
+
+           scheduler.rescheduleJob(triggerKey, cronTrigger);
        }catch (SchedulerException e){
            log.error("SchedulerException rescheduleMaintenanceTask ERROR",e);
            throw new RuntimeException(e);
@@ -93,6 +120,7 @@
     public void unscheduleMaintenanceTask(Long taskId){
         try {
             JobKey jobKey = new JobKey("MaintenanceTask_" + taskId);
+            // 鍒犻櫎 Job 浼氳嚜鍔ㄥ垹闄ゅ叧鑱旂殑 Trigger
             scheduler.deleteJob(jobKey);
         }catch (SchedulerException e){
             log.error("SchedulerException unscheduleMaintenanceTask ERROR",e);
diff --git a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
index d0ba21f..0d2b421 100644
--- a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
+++ b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
@@ -1,6 +1,6 @@
 package com.ruoyi.device.service.impl;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.utils.bean.BeanUtils;
@@ -35,7 +35,9 @@
 
     @Override
     public AjaxResult listPage(Page page, MaintenanceTask maintenanceTask) {
-        Page<MaintenanceTask> taskPage = maintenanceTaskMapper.selectPage(page, new QueryWrapper<MaintenanceTask>().orderByDesc("create_time"));
+       LambdaQueryWrapper<MaintenanceTask> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.orderByDesc(MaintenanceTask::getId);
+        Page<MaintenanceTask> taskPage = maintenanceTaskMapper.selectPage(page, queryWrapper);
         // 2. 濡傛灉娌℃湁鏁版嵁锛岀洿鎺ヨ繑鍥炵┖鍒嗛〉
         if (taskPage.getRecords().isEmpty()) {
             return AjaxResult.success(taskPage);
@@ -68,7 +70,6 @@
 
     @Override
     public AjaxResult add(MaintenanceTask maintenanceTask) {
-        maintenanceTask.setActive(true);
         // 璁$畻棣栨鎵ц鏃堕棿
         TimingTask task = new TimingTask();
         task.setFrequencyType(maintenanceTask.getFrequencyType());
@@ -77,7 +78,10 @@
         maintenanceTask.setNextExecutionTime(firstExecutionTime);
         int insert = maintenanceTaskMapper.insert(maintenanceTask);
         if (insert > 0) {
-            maintenanceTaskScheduler.scheduleMaintenanceTask(maintenanceTask);
+            // 鍙湁褰� isActive 涓� 1 鏃舵墠娣诲姞鍒板畾鏃朵换鍔¤皟搴﹀櫒
+            if (maintenanceTask.getIsActive() != null && maintenanceTask.getIsActive() == 1) {
+                maintenanceTaskScheduler.scheduleMaintenanceTask(maintenanceTask);
+            }
         }
         return AjaxResult.success("娣诲姞鎴愬姛");
     }
@@ -88,22 +92,50 @@
         if (maintenanceTask1 == null) {
             return AjaxResult.warn("娌℃湁姝ゆ暟鎹�");
         }
+
+        // 淇濆瓨鏃х殑 isActive 鐘舵��
+        Integer oldIsActive = maintenanceTask1.getIsActive();
+        Integer newIsActive = maintenanceTask.getIsActive();
+
         BeanUtils.copyProperties(maintenanceTask, maintenanceTask1);
         int update = maintenanceTaskMapper.updateById(maintenanceTask1);
         if (update > 0) {
-            maintenanceTaskScheduler.rescheduleMaintenanceTask(maintenanceTask1);
+            // 澶勭悊 isActive 鐘舵�佸彉鍖�
+            if (newIsActive != null && newIsActive == 1) {
+                // 鏂扮姸鎬佷负鍚敤锛氭坊鍔犲埌瀹氭椂浠诲姟璋冨害鍣�
+                if (oldIsActive == null || oldIsActive != 1) {
+                    // 浠庢湭鍚敤鍙樹负鍚敤锛屾坊鍔犲埌璋冨害鍣�
+                    maintenanceTaskScheduler.scheduleMaintenanceTask(maintenanceTask1);
+                } else {
+                    // 宸茬粡鍚敤锛屾洿鏂拌皟搴﹀櫒涓殑浠诲姟
+                    maintenanceTaskScheduler.rescheduleMaintenanceTask(maintenanceTask1);
+                }
+            } else {
+                // 鏂扮姸鎬佷负鍋滅敤锛氫粠瀹氭椂浠诲姟璋冨害鍣ㄤ腑绉婚櫎
+                if (oldIsActive != null && oldIsActive == 1) {
+                    maintenanceTaskScheduler.unscheduleMaintenanceTask(maintenanceTask1.getId());
+                }
+            }
         }
         return AjaxResult.success("鏇存柊鎴愬姛");
     }
 
     @Override
     public AjaxResult delete(List<Long> ids) {
+        // 鍏堜粠瀹氭椂浠诲姟璋冨害鍣ㄤ腑绉婚櫎鎵�鏈夊緟鍒犻櫎鐨勪换鍔�
+        ids.forEach(id -> {
+            try {
+                maintenanceTaskScheduler.unscheduleMaintenanceTask(id);
+            } catch (Exception e) {
+                log.error("鍒犻櫎瀹氭椂浠诲姟璋冨害澶辫触, id: {}", id, e);
+            }
+        });
+
+        // 鍐嶄粠鏁版嵁搴撲腑鍒犻櫎璁板綍
         int delete = maintenanceTaskMapper.deleteBatchIds(ids);
         if (delete > 0) {
-            ids.forEach(id -> {
-                maintenanceTaskScheduler.unscheduleMaintenanceTask(id);
-            });
+            return AjaxResult.success("鍒犻櫎鎴愬姛");
         }
-        return AjaxResult.success("鍒犻櫎鎴愬姛");
+        return AjaxResult.error("鍒犻櫎澶辫触");
     }
 }
diff --git a/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java b/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java
index 2cc50ba..66a00e7 100644
--- a/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java
+++ b/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java
@@ -1,64 +1,30 @@
-package com.ruoyi.framework.config;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
-import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
-import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
-import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
-import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
-import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.EnableAspectJAutoProxy;
-
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.TimeZone;
-
-/**
- * 绋嬪簭娉ㄨВ閰嶇疆
- *
- * @author ruoyi
- */
-@Configuration
-// 琛ㄧず閫氳繃aop妗嗘灦鏆撮湶璇ヤ唬鐞嗗璞�,AopContext鑳藉璁块棶
-@EnableAspectJAutoProxy(exposeProxy = true)
-// 鎸囧畾瑕佹壂鎻忕殑Mapper绫荤殑鍖呯殑璺緞
-@MapperScan("com.ruoyi.**.mapper")
-public class ApplicationConfig {
-    /**
-     * 鏃跺尯閰嶇疆
-     */
-    @Bean
-    public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() {
-        return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault());
-    }
-
-    @Bean
-    public ObjectMapper objectMapper() {
-        ObjectMapper mapper = new ObjectMapper();
-        // 鍏ㄥ眬蹇界暐鏈煡瀛楁
-        mapper.configure(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-        JavaTimeModule module = new JavaTimeModule();
-        // LocalDateTime锛氭敮鎸� yyyy-MM-dd HH:mm:ss
-        DateTimeFormatter dateTimeFormatter =
-                DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-        module.addDeserializer(LocalDateTime.class,
-                new LocalDateTimeDeserializer(dateTimeFormatter));
-        module.addSerializer(LocalDateTime.class,
-                new LocalDateTimeSerializer(dateTimeFormatter));
-        // LocalDate锛氭敮鎸� yyyy-MM-dd
-        DateTimeFormatter dateFormatter =
-                DateTimeFormatter.ofPattern("yyyy-MM-dd");
-        module.addDeserializer(LocalDate.class,
-                new LocalDateDeserializer(dateFormatter));
-        module.addSerializer(LocalDate.class,
-                new LocalDateSerializer(dateFormatter));
-        mapper.registerModule(module);
-        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
-        return mapper;
-    }
-}
+package com.ruoyi.framework.config;
+
+import java.util.TimeZone;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+
+/**
+ * 绋嬪簭娉ㄨВ閰嶇疆
+ *
+ * @author ruoyi
+ */
+@Configuration
+// 琛ㄧず閫氳繃aop妗嗘灦鏆撮湶璇ヤ唬鐞嗗璞�,AopContext鑳藉璁块棶
+@EnableAspectJAutoProxy(exposeProxy = true)
+// 鎸囧畾瑕佹壂鎻忕殑Mapper绫荤殑鍖呯殑璺緞
+@MapperScan("com.ruoyi.**.mapper")
+public class ApplicationConfig
+{
+    /**
+     * 鏃跺尯閰嶇疆
+     */
+    @Bean
+    public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization()
+    {
+        return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault());
+    }
+}
diff --git a/src/main/java/com/ruoyi/home/controller/HomeController.java b/src/main/java/com/ruoyi/home/controller/HomeController.java
index 35c3954..5d7d6ce 100644
--- a/src/main/java/com/ruoyi/home/controller/HomeController.java
+++ b/src/main/java/com/ruoyi/home/controller/HomeController.java
@@ -61,8 +61,7 @@
     private static final Integer ORDER_STATUS_WAIT = 1;
     private static final Integer ORDER_STATUS_RUNNING = 2;
     private static final Integer ORDER_STATUS_COMPLETED = 3;
-    //private static final Integer ORDER_STATUS_END = 4;  // 宸插彇娑�
-    private static final Integer ORDER_STATUS_END = 5;
+    private static final Integer ORDER_STATUS_PAUSED = 4;
 
     /********************************************************鍩虹绫�*****************************************************/
     @GetMapping("/todos")
@@ -163,8 +162,8 @@
 
     @GetMapping("/processOutputAnalysis")
     @Operation(summary = "宸ュ簭浜у嚭鍒嗘瀽")
-    public R processOutputAnalysis(@DefaultType Integer type){
-        List<MapDto> list = homeService.processOutputAnalysis(type);
+    public R processOutputAnalysis(@DefaultType Integer dateType){
+        List<MapDto> list = homeService.processOutputAnalysis(dateType);
         return R.ok(list);
     }
 
@@ -261,14 +260,13 @@
         }
         Integer statusFromParam = parseOrderStatus(status);
         if (!isBlank(status) && statusFromParam == null && !"all".equalsIgnoreCase(status.trim())) {
-            return R.fail("status鍙傛暟涓嶅悎娉曪紝鍙�夊�硷細all/waiting/inProgress/completed/end 鎴� 1/2/3/5");
+            return R.fail("status鍙傛暟涓嶅悎娉曪紝鍙�夊�硷細all/waiting/inProgress/completed/paused 鎴� 1/2/3/4");
         }
         Integer queryStatus = resolveOrderStatus(status, tab);
 
         long safePageNum = pageNum == null || pageNum < 1 ? 1 : pageNum;
-        boolean queryAll = pageSize != null && pageSize == -1;
-        long safePageSize = queryAll ? -1 : (pageSize == null || pageSize < 1 ? 10 : Math.min(pageSize, 50));
-        long offset = queryAll ? 0 : (safePageNum - 1) * safePageSize;
+        long safePageSize = pageSize == null || pageSize < 1 ? 10 : Math.min(pageSize, 50);
+        long offset = (safePageNum - 1) * safePageSize;
         LocalDateTime startTime = queryDate == null ? null : queryDate.atStartOfDay();
         LocalDateTime endTime = queryDate == null ? null : queryDate.plusDays(1).atStartOfDay();
 
@@ -283,7 +281,7 @@
         long waitingCount = 0L;
         long inProgressCount = 0L;
         long completedCount = 0L;
-        long endCount = 0L;
+        long pausedCount = 0L;
         List<Map<String, Object>> statusCountRows = productionOrderMapper.countHomeOrderProgressByStatus(startTime, endTime);
         if (statusCountRows != null) {
             for (Map<String, Object> countRow : statusCountRows) {
@@ -295,8 +293,8 @@
                     inProgressCount = cnt;
                 } else if (Objects.equals(statusKey, ORDER_STATUS_COMPLETED)) {
                     completedCount = cnt;
-                } else if (Objects.equals(statusKey, ORDER_STATUS_END)) {
-                    endCount = cnt;
+                } else if (Objects.equals(statusKey, ORDER_STATUS_PAUSED)) {
+                    pausedCount = cnt;
                 }
             }
         }
@@ -305,13 +303,13 @@
         result.put("tab", mapOrderTab(queryStatus));
         result.put("status", mapOrderStatus(queryStatus));
         result.put("bizDate", queryDate == null ? null : queryDate.format(DATE_FORMATTER));
-        result.put("total", toLong(productionOrderMapper.countHomeOrderProgress(null, startTime, endTime)));
+        result.put("total", toLong(productionOrderMapper.countHomeOrderProgress(queryStatus, startTime, endTime)));
         result.put("pageNum", safePageNum);
         result.put("pageSize", safePageSize);
         result.put("waitingCount", waitingCount);
         result.put("inProgressCount", inProgressCount);
         result.put("completedCount", completedCount);
-        result.put("endCount", endCount);
+        result.put("pausedCount", pausedCount);
         result.put("records", records);
         return R.ok(result);
     }
@@ -531,8 +529,8 @@
         if ("3".equals(normalized) || "completed".equals(normalized)) {
             return ORDER_STATUS_COMPLETED;
         }
-        if ("5".equals(normalized) || "end".equals(normalized)) {
-            return ORDER_STATUS_END;
+        if ("4".equals(normalized) || "paused".equals(normalized)) {
+            return ORDER_STATUS_PAUSED;
         }
         return null;
     }
@@ -544,8 +542,8 @@
         if (Objects.equals(status, ORDER_STATUS_COMPLETED)) {
             return "completed";
         }
-        if (Objects.equals(status, ORDER_STATUS_END)) {
-            return "end";
+        if (Objects.equals(status, ORDER_STATUS_PAUSED)) {
+            return "paused";
         }
         if (Objects.equals(status, ORDER_STATUS_WAIT)) {
             return "waiting";
@@ -563,8 +561,8 @@
         if (Objects.equals(status, ORDER_STATUS_COMPLETED)) {
             return "completed";
         }
-        if (Objects.equals(status, ORDER_STATUS_END)) {
-            return "end";
+        if (Objects.equals(status, ORDER_STATUS_PAUSED)) {
+            return "paused";
         }
         return "all";
     }
@@ -579,8 +577,8 @@
         if (Objects.equals(status, ORDER_STATUS_COMPLETED)) {
             return "宸插畬鎴�";
         }
-        if (Objects.equals(status, ORDER_STATUS_END)) {
-            return "宸茬粨鏉�";
+        if (Objects.equals(status, ORDER_STATUS_PAUSED)) {
+            return "宸叉殏鍋�";
         }
         return "鏈煡";
     }
@@ -637,7 +635,7 @@
                 .select(ProductionOrder::getQuantity, ProductionOrder::getCompleteQuantity)
                 .ge(ProductionOrder::getCreateTime, day.atStartOfDay())
                 .lt(ProductionOrder::getCreateTime, day.plusDays(1).atStartOfDay())
-                .ne(ProductionOrder::getStatus, ORDER_STATUS_END));
+                .ne(ProductionOrder::getStatus, ORDER_STATUS_PAUSED));
 
         BigDecimal totalQuantity = BigDecimal.ZERO;
         BigDecimal totalCompleteQuantity = BigDecimal.ZERO;
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 8aa7871..46c6f58 100644
--- a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
+++ b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -18,11 +18,7 @@
 import com.ruoyi.account.pojo.purchase.AccountPurchasePayment;
 import com.ruoyi.account.pojo.sales.AccountSalesCollection;
 import com.ruoyi.approve.mapper.ApproveProcessMapper;
-import com.ruoyi.approve.mapper.ApprovalInstanceMapper;
-import com.ruoyi.approve.mapper.ApprovalTaskMapper;
 import com.ruoyi.approve.pojo.ApproveProcess;
-import com.ruoyi.approve.pojo.ApprovalInstance;
-import com.ruoyi.approve.pojo.ApprovalTask;
 import com.ruoyi.basic.mapper.CustomerMapper;
 import com.ruoyi.basic.mapper.ProductMapper;
 import com.ruoyi.basic.mapper.SupplierManageMapper;
@@ -32,7 +28,6 @@
 import com.ruoyi.collaborativeApproval.mapper.NoticeMapper;
 import com.ruoyi.collaborativeApproval.pojo.Notice;
 import com.ruoyi.common.enums.ApproveTypeEnum;
-import com.ruoyi.common.enums.TypeEnums;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.device.mapper.DeviceRepairMapper;
@@ -66,6 +61,7 @@
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
@@ -102,10 +98,6 @@
     private final QualityInspectMapper qualityStatisticsMapper;
 
     private final ApproveProcessMapper approveProcessMapper;
-
-    private final ApprovalTaskMapper approvalTaskMapper;
-
-    private final ApprovalInstanceMapper approvalInstanceMapper;
 
     private final SysDeptMapper sysDeptMapper;
 
@@ -393,58 +385,40 @@
     @Override
     public List<ApproveProcess> todos() throws ParseException {
         LoginUser loginUser = SecurityUtils.getLoginUser();
-        List<ApproveProcess> approveProcesses = new ArrayList<>();
-
-        // 鏌ヨ鏃у鎵硅〃锛坅pprove_process锛�
         LambdaQueryWrapper<ApproveProcess> approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>();
         approveProcessLambdaQueryWrapper.eq(ApproveProcess::getApproveDelete, 0)
                 .eq(ApproveProcess::getApproveUserCurrentId, loginUser.getUserId())
                 .ne(ApproveProcess::getApproveStatus, 2);
-        List<ApproveProcess> oldList = approveProcessMapper.selectList(approveProcessLambdaQueryWrapper);
-        if (!CollectionUtils.isEmpty(oldList)) {
-            oldList.forEach(a -> {
-                if (a.getApproveType() != null) {
-                    a.setApproveTypeName(ApproveTypeEnum.getNameByCode(a.getApproveType()));
-                }
-            });
-            approveProcesses.addAll(oldList);
+        // .eq(ApproveProcess::getTenantId, loginUser.getTenantId());
+        List<ApproveProcess> approveProcesses = approveProcessMapper.selectList(approveProcessLambdaQueryWrapper);
+        if (CollectionUtils.isEmpty(approveProcesses)) {
+            approveProcesses = new ArrayList<>();
         }
 
-        // 鏌ヨ鏂板鎵硅〃锛坅pproval_task + approval_instance锛�
-        List<ApprovalTask> pendingTasks = approvalTaskMapper.selectList(new LambdaQueryWrapper<ApprovalTask>()
-                .eq(ApprovalTask::getApproverId, loginUser.getUserId())
-                .eq(ApprovalTask::getTaskStatus, "PENDING")
-                .eq(ApprovalTask::getDeleted, 0));
-        if (!CollectionUtils.isEmpty(pendingTasks)) {
-            List<Long> instanceIds = pendingTasks.stream()
-                    .map(ApprovalTask::getInstanceId)
-                    .distinct()
-                    .collect(Collectors.toList());
-            List<ApprovalInstance> instances = approvalInstanceMapper.selectList(new LambdaQueryWrapper<ApprovalInstance>()
-                    .in(ApprovalInstance::getId, instanceIds)
-                    .eq(ApprovalInstance::getDeleted, 0));
-            Map<Long, ApprovalInstance> instanceMap = instances.stream()
-                    .collect(Collectors.toMap(ApprovalInstance::getId, i -> i, (a, b) -> a));
-
-            for (ApprovalTask task : pendingTasks) {
-                ApprovalInstance instance = instanceMap.get(task.getInstanceId());
-                if (instance == null) {
-                    continue;
-                }
-                ApproveProcess ap = new ApproveProcess();
-                ap.setId(instance.getId());
-                ap.setApproveId(instance.getInstanceNo());
-                ap.setApproveReason(instance.getTitle());
-                ap.setApproveTime(instance.getApplyTime() != null ? java.sql.Timestamp.valueOf(instance.getApplyTime()) : null);
-                ap.setApproveUserName(instance.getApplicantName());
-                ap.setApproveDeptName(instance.getTemplateName());
-                if (instance.getBusinessType() != null) {
-                    ap.setApproveType(instance.getBusinessType().intValue());
-                    ap.setApproveTypeName(TypeEnums.getLabelByValue(instance.getBusinessType()));
-                }
-                approveProcesses.add(ap);
+        approveProcesses.forEach(a -> {
+            if (a.getApproveType() != null) {
+                a.setApproveTypeName(ApproveTypeEnum.getNameByCode(a.getApproveType()));
             }
-        }
+        });
+        // // 鏌ヨ鏈鐢ㄥ姵淇濊褰�
+        // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        //
+        // LaborIssue laborIssue1 = new LaborIssue();
+        // laborIssue1.setAdoptedDate(new Date());
+        // laborIssue1.setIssueDate(sdf.parse(sdf.format(new Date())));
+        // List<LaborIssue> laborIssues = lavorIssueMapper.list(laborIssue1);
+        // //staff_join_leave_record琛ㄨ鍒犻櫎
+        // if(!CollectionUtils.isEmpty(laborIssues)){
+        // for (LaborIssue laborIssue : laborIssues) {
+        // ApproveProcess approveProcess = new ApproveProcess();
+        // approveProcess.setApproveId(laborIssue.getOrderNo());
+        // approveProcess.setApproveDeptName(sysDeptMapper.selectDeptById(loginUser.getTenantId()).getDeptName());
+        // approveProcess.setApproveTime(laborIssue.getIssueDate());
+        // approveProcess.setApproveReason(laborIssue.getDictTypeName() + "-" +
+        // laborIssue.getDictName() + "瓒呮椂鏈鍙�");
+        // approveProcesses.add(approveProcess);
+        // }
+        // }
 
         return approveProcesses;
     }
@@ -497,23 +471,18 @@
 
     @Override
     public Map<String, Object> approveAndDeviceTodos() {
-        // 鏃у鎵硅〃寰呭姙
-        Long oldCount = approveProcessMapper.selectCount(new LambdaQueryWrapper<ApproveProcess>()
+        // 瀹℃壒鍗忓悓寰呭姙
+        Long aLong = approveProcessMapper.selectCount(new LambdaQueryWrapper<ApproveProcess>()
                 .eq(ApproveProcess::getApproveUserCurrentId, SecurityUtils.getUserId())
                 .eq(ApproveProcess::getApproveDelete, 0)
                 .in(ApproveProcess::getApproveStatus, 0, 1, 3));
-        // 鏂板鎵硅〃寰呭姙
-        Long newCount = approvalTaskMapper.selectCount(new LambdaQueryWrapper<ApprovalTask>()
-                .eq(ApprovalTask::getApproverId, SecurityUtils.getUserId())
-                .eq(ApprovalTask::getTaskStatus, "PENDING")
-                .eq(ApprovalTask::getDeleted, 0));
         // 璁惧鎶ヤ慨寰呭姙
         Long aLong1 = deviceRepairMapper.selectCount(new LambdaQueryWrapper<DeviceRepair>()
                 .eq(DeviceRepair::getStatus, 0)
                 .eq(DeviceRepair::getRepairName, SecurityUtils.getLoginUser().getNickName()));
         return new HashMap<String, Object>() {
             {
-                put("approveTodo", oldCount + newCount);
+                put("approveTodo", aLong);
                 put("deviceRepairTodo", aLong1);
             }
         };
@@ -529,9 +498,20 @@
 
     @Override
     public ProductionProgressDto productionProgress() {
+        LocalDateTime now = LocalDateTime.now();
+
+        LocalDateTime startOfMonth = now
+                .with(TemporalAdjusters.firstDayOfMonth())
+                .with(LocalTime.MIN);
+
+        LocalDateTime endOfMonth = now
+                .with(TemporalAdjusters.lastDayOfMonth())
+                .with(LocalTime.MAX);
+
+
         ProductionProgressDto productionProgressDto = new ProductionProgressDto();
-        List<ProductionProgressOrderDto> orderDetails = productionOrderMapper.selectProgressOrders(
-                LocalDateTime.now().minusMonths(1), LocalDateTime.now());
+        List<ProductionProgressOrderDto> orderDetails = productionOrderMapper
+                .selectProgressOrders(startOfMonth, endOfMonth);
         productionProgressDto.setCompletedOrderDetails(orderDetails);
         long totalCount = orderDetails.size();
         long count = orderDetails.stream().filter(
@@ -551,7 +531,7 @@
     public ProductionTurnoverDto workInProcessTurnover() {
         ProductionTurnoverDto productionTurnoverDto = new ProductionTurnoverDto();
         List<ProductionTaskStatisticsDto> taskList = productionOperationTaskMapper
-                .selectTaskStatisticsByDate(LocalDate.now().minusMonths(1), LocalDate.now());
+                .selectTaskStatisticsByDate(LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()), LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()));
         long sum = taskList.stream()
                 .filter(task -> defaultDecimal(task.getPlanQuantity()).compareTo(defaultDecimal(task.getCompleteQuantity())) > 0)
                 .map(ProductionTaskStatisticsDto::getPlanQuantity)
@@ -1377,15 +1357,15 @@
         String endStr = endDate.atStartOfDay()
                 .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
 
-//        List<Map<String, Object>> inputList = productionProductInputMapper.selectInputStats(startStr, endStr);
-        List<Map<String, Object>> inputList = null;
+        List<Map<String, Object>> inputList = productionProductInputMapper.selectInputStats(startStr, endStr);
+        //List<Map<String, Object>> inputList = null;
         List<Map<String, Object>> outputList = productionProductOutputMapper.selectDailyOutputStats(startStr, endStr);
 
         Map<String, InputOutputAnalysisDto> dateMap = new HashMap<>();
 
         if (!CollectionUtils.isEmpty(inputList)) {
             for (Map<String, Object> map : inputList) {
-                String date = (String) map.get("date");
+                String date = (String) map.get("statDate");
                 if (date == null)
                     continue;
                 InputOutputAnalysisDto dto = dateMap.getOrDefault(date, new InputOutputAnalysisDto());
@@ -1398,7 +1378,7 @@
 
         if (!CollectionUtils.isEmpty(outputList)) {
             for (Map<String, Object> map : outputList) {
-                String date = (String) map.get("date");
+                String date = (String) map.get("statDate");
                 if (date == null)
                     continue;
                 InputOutputAnalysisDto dto = dateMap.getOrDefault(date, new InputOutputAnalysisDto());
@@ -1657,16 +1637,16 @@
     @Override
     public List<MapDto> orderCount() {
         LocalDate now = LocalDate.now();
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
-        String currentStart = now.withDayOfMonth(1).atStartOfDay()
-                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
-        String currentEnd = now.atTime(LocalTime.MAX).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+        LocalDateTime startDateTime = now.with(TemporalAdjusters.firstDayOfMonth()).atStartOfDay();
+        LocalDateTime endDateTime = now.with(TemporalAdjusters.lastDayOfMonth()).atTime(LocalTime.MAX);
 
-        LocalDate lastMonthDate = now.minusMonths(1);
-        String lastStart = lastMonthDate.withDayOfMonth(1).atStartOfDay()
-                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
-        String lastEnd = lastMonthDate.withDayOfMonth(lastMonthDate.lengthOfMonth()).atTime(LocalTime.MAX)
-                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+        String currentStart = startDateTime.format(dateTimeFormatter);
+        String currentEnd = endDateTime.format(dateTimeFormatter);
+
+        String lastStart = startDateTime.minusMonths(1).format(dateTimeFormatter);
+        String lastEnd = endDateTime.format(dateTimeFormatter);
 
         int currentCreated = productionOrderMapper.countCreated(currentStart, currentEnd);
         int lastCreated = productionOrderMapper.countCreated(lastStart, lastEnd);
diff --git a/src/main/java/com/ruoyi/inspectiontask/controller/InspectionTaskController.java b/src/main/java/com/ruoyi/inspectiontask/controller/InspectionTaskController.java
index be8dda5..8c61126 100644
--- a/src/main/java/com/ruoyi/inspectiontask/controller/InspectionTaskController.java
+++ b/src/main/java/com/ruoyi/inspectiontask/controller/InspectionTaskController.java
@@ -3,6 +3,8 @@
 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.R;
 import com.ruoyi.inspectiontask.dto.InspectionTaskDto;
@@ -43,8 +45,9 @@
     /**
      * 瀵煎嚭
      */
-    @PostMapping("/export")
+    @Log(title = "妫�楠屼换鍔�", businessType = BusinessType.EXPORT)
     @Operation(summary = "瀵煎嚭瀹氭椂浠诲姟璁板綍")
+    @PostMapping("/export")
     public void export(HttpServletResponse response) {
         Page page = new Page<>(-1, -1);
         InspectionTaskDto timingTask = new InspectionTaskDto();
@@ -56,8 +59,9 @@
     /**
      * 宸℃浠诲姟琛ㄦ柊澧炰慨鏀�
      */
-    @PostMapping("/addOrEditInspectionTask")
+    @Log(title = "妫�楠屼换鍔�", businessType = BusinessType.INSERT)
     @Operation(summary = "宸℃浠诲姟琛ㄦ柊澧炰慨鏀�")
+    @PostMapping("/addOrEditInspectionTask")
     @Transactional(rollbackFor = Exception.class)
     public R addOrEditInspectionTask(@RequestBody InspectionTaskDto inspectionTaskDto) {
         return R.ok(inspectionTaskService.addOrEditInspectionTask(inspectionTaskDto));
@@ -66,8 +70,9 @@
     /**
      * 宸℃浠诲姟琛ㄥ垹闄�
      */
-    @DeleteMapping("/delInspectionTask")
+    @Log(title = "妫�楠屼换鍔�", businessType = BusinessType.DELETE)
     @Operation(summary = "宸℃浠诲姟琛ㄥ垹闄�")
+    @DeleteMapping("/delInspectionTask")
     @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
index 9baaf09..80089ca 100644
--- a/src/main/java/com/ruoyi/inspectiontask/controller/QrCodeController.java
+++ b/src/main/java/com/ruoyi/inspectiontask/controller/QrCodeController.java
@@ -2,6 +2,8 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.inspectiontask.dto.QrCodeDto;
@@ -37,8 +39,9 @@
     /**
      * 浜岀淮鐮佺鐞嗚〃鏂板淇敼
      */
-    @PostMapping("/addOrEditQrCode")
+    @Log(title = "浜岀淮鐮�", businessType = BusinessType.INSERT)
     @Operation(summary = "浜岀淮鐮佺鐞嗚〃鏂板淇敼")
+    @PostMapping("/addOrEditQrCode")
     public R<Long> addOrEditQrCode(@RequestBody QrCodeDto qrCodeDto) {
         return R.ok(qrCodeService.addOrEditQrCode(qrCodeDto));
     }
@@ -46,8 +49,9 @@
     /**
      * 浜岀淮鐮佺鐞嗚〃鍒犻櫎
      */
-    @DeleteMapping("/delQrCode")
+    @Log(title = "浜岀淮鐮�", businessType = BusinessType.DELETE)
     @Operation(summary = "浜岀淮鐮佺鐞嗚〃鍒犻櫎")
+    @DeleteMapping("/delQrCode")
     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
index f597205..a2cdc67 100644
--- a/src/main/java/com/ruoyi/inspectiontask/controller/QrCodeScanRecordController.java
+++ b/src/main/java/com/ruoyi/inspectiontask/controller/QrCodeScanRecordController.java
@@ -2,6 +2,8 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.inspectiontask.dto.QrCodeScanRecordDto;
@@ -38,8 +40,9 @@
     /**
      * 浜岀淮鐮佹壂鐮佽褰曡〃鏂板淇敼
      */
-    @PostMapping("/addOrEditQrCodeRecord")
+    @Log(title = "浜岀淮鐮佹壂鎻忚褰�", businessType = BusinessType.INSERT)
     @Operation(summary = "浜岀淮鐮佹壂鐮佽褰曡〃鏂板淇敼")
+    @PostMapping("/addOrEditQrCodeRecord")
     public R addOrEditQrCodeRecord(@RequestBody QrCodeScanRecordDto qrCodeScanRecordDto) {
         return R.ok(qrCodeScanRecordService.addOrEditQrCodeRecord(qrCodeScanRecordDto));
     }
@@ -47,8 +50,9 @@
     /**
      * 浜岀淮鐮佹壂鐮佽褰曡〃鍒犻櫎
      */
-    @DeleteMapping("/delSalesRecord")
+    @Log(title = "浜岀淮鐮佹壂鎻忚褰�", businessType = BusinessType.DELETE)
     @Operation(summary = "浜岀淮鐮佹壂鐮佽褰曡〃鍒犻櫎")
+    @DeleteMapping("/delSalesRecord")
     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
index ad2e338..d3baf78 100644
--- a/src/main/java/com/ruoyi/inspectiontask/controller/TimingTaskController.java
+++ b/src/main/java/com/ruoyi/inspectiontask/controller/TimingTaskController.java
@@ -42,6 +42,7 @@
     /**
      * 瀵煎嚭
      */
+    @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     @Operation(summary = "瀵煎嚭瀹氭椂浠诲姟")
     public void export(HttpServletResponse response) {
@@ -55,9 +56,9 @@
     /**
      * 瀹氭椂宸℃浠诲姟琛ㄦ柊澧炰慨鏀�
      */
+    @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.INSERT)
     @PostMapping("/addOrEditTimingTask")
     @Operation(summary = "鏂板淇敼瀹氭椂浠诲姟")
-    @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.INSERT)
     public R addOrEditTimingTask(@RequestBody TimingTaskDto timingTaskDto) throws SchedulerException {
         return R.ok(timingTaskService.addOrEditTimingTask(timingTaskDto));
     }
@@ -65,9 +66,9 @@
     /**
      * 瀹氭椂宸℃浠诲姟琛ㄥ垹闄�
      */
+    @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.DELETE)
     @DeleteMapping("/delTimingTask")
     @Operation(summary = "鍒犻櫎瀹氭椂浠诲姟")
-    @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.DELETE)
     public R remove(@RequestBody Long[] ids) {
         return R.ok(timingTaskService.delByIds(ids));
     }
diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java
index 9729b40..5826fa7 100644
--- a/src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java
+++ b/src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java
@@ -67,7 +67,6 @@
         if (StringUtils.isNotBlank(inspectionTaskDto.getInspectionProject())) {
             queryWrapper.like(InspectionTask::getInspectionProject, inspectionTaskDto.getInspectionProject());
         }
-        queryWrapper.orderByDesc(InspectionTask::getCreateTime);
         IPage<InspectionTask> entityPage = inspectionTaskMapper.selectPage(page, queryWrapper);
 
         //  鏃犳暟鎹彁鍓嶈繑鍥�
diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java
index a6179f6..63289a7 100644
--- a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java
+++ b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java
@@ -35,6 +35,17 @@
 
         // 鑾峰彇鐜版湁瑙﹀彂鍣ㄥ苟杞崲涓� CronTrigger
         Trigger oldTrigger = scheduler.getTrigger(triggerKey);
+        if (oldTrigger == null) {
+            JobKey jobKey = new JobKey("timingTask_" + task.getId());
+            JobDetail jobDetail = scheduler.getJobDetail(jobKey);
+            if (jobDetail != null) {
+                Trigger trigger = buildJobTrigger(task, jobDetail);
+                scheduler.scheduleJob(trigger);
+            } else {
+                scheduleTimingTask(task);
+            }
+            return;
+        }
         if (!(oldTrigger instanceof CronTrigger)) {
             throw new SchedulerException("Existing trigger is not a CronTrigger");
         }
@@ -144,18 +155,13 @@
 
         // 浣跨敤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());
-        }
+        return switch (frequencyType) {
+            case "DAILY" -> convertDailyToCron(task.getFrequencyDetail());
+            case "WEEKLY" -> convertWeeklyToCron(task.getFrequencyDetail());
+            case "MONTHLY" -> convertMonthlyToCron(task.getFrequencyDetail());
+            case "QUARTERLY" -> convertQuarterlyToCron(task.getFrequencyDetail());
+            default -> throw new IllegalArgumentException("涓嶆敮鎸佺殑棰戠巼绫诲瀷: " + task.getFrequencyType());
+        };
     }
 
     // 姣忔棩浠诲姟杞崲
diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
index ebe615d..09491ab 100644
--- a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
+++ b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
@@ -53,7 +53,8 @@
         if (timingTask.getIsEnabled() != null) {
             queryWrapper.eq(TimingTask::getIsEnabled, timingTask.getIsEnabled());
         }
-        queryWrapper.orderByDesc(TimingTask::getCreateTime);
+        // 鎸� ID 鍊掑簭鎺掑簭
+        queryWrapper.orderByDesc(TimingTask::getId);
         IPage<TimingTask> taskPage = timingTaskMapper.selectPage(page, queryWrapper);
 
         // 2. 濡傛灉娌℃湁鏁版嵁锛岀洿鎺ヨ繑鍥炵┖鍒嗛〉
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsRequisitionRecordController.java b/src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsRequisitionRecordController.java
index 26195a4..a37f99f 100644
--- a/src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsRequisitionRecordController.java
+++ b/src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsRequisitionRecordController.java
@@ -2,6 +2,8 @@
 
 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.SparePartsRequisitionRecordDto;
 import com.ruoyi.measuringinstrumentledger.service.SparePartsRequisitionRecordService;
@@ -29,6 +31,7 @@
 
     @GetMapping("/listPage")
     @Operation(summary = "澶囦欢鍒嗙被-鍒嗛〉鏌ヨ")
+    @Log(title = "澶囦欢棰嗙敤璁板綍-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
     public AjaxResult listPage(Page page, SparePartsRequisitionRecordDto sparePartsRequisitionRecordDto){
         IPage<SparePartsRequisitionRecordDto> listPage = sparePartsRequisitionRecordService.listPage(page, sparePartsRequisitionRecordDto);
         return AjaxResult.success(listPage);
diff --git a/src/main/java/com/ruoyi/officesupplies/controller/OfficeSuppliesController.java b/src/main/java/com/ruoyi/officesupplies/controller/OfficeSuppliesController.java
index 3588d6c..48f5a59 100644
--- a/src/main/java/com/ruoyi/officesupplies/controller/OfficeSuppliesController.java
+++ b/src/main/java/com/ruoyi/officesupplies/controller/OfficeSuppliesController.java
@@ -44,6 +44,7 @@
 
     @PostMapping("/add")
     @Operation(summary = "鍔炲叕鐗╄祫-娣诲姞")
+    @Log(title = "鍔炲叕鐗╄祫-娣诲姞", businessType = BusinessType.INSERT)
     @Transactional(rollbackFor = Exception.class)
     public AjaxResult add(@RequestBody OfficeSupplies officeSupplies) {
         // 鎸夌収褰撳墠鏃堕棿yyyyMMdd + 褰撳ぉ鏂板鏁伴噺 + 1鐢熸垚缂栧彿
@@ -60,6 +61,7 @@
 
     @PostMapping("/update")
     @Operation(summary = "鍔炲叕鐗╄祫-淇敼")
+    @Log(title = "鍔炲叕鐗╄祫-淇敼", businessType = BusinessType.UPDATE)
     @Transactional(rollbackFor = Exception.class)
     public AjaxResult update(@RequestBody OfficeSupplies officeSupplies) {
         return officeSuppliesService.updateById(officeSupplies) ? success() : error();
@@ -67,6 +69,7 @@
 
     @DeleteMapping("/delete")
     @Operation(summary = "鍔炲叕鐗╄祫-鍒犻櫎")
+    @Log(title = "鍔炲叕鐗╄祫-鍒犻櫎", businessType = BusinessType.DELETE)
     @Transactional(rollbackFor = Exception.class)
     public AjaxResult delete(@RequestBody List<Long> ids) {
         if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
diff --git a/src/main/java/com/ruoyi/other/controller/PdaVersionController.java b/src/main/java/com/ruoyi/other/controller/PdaVersionController.java
index 326db6a..f97e05f 100644
--- a/src/main/java/com/ruoyi/other/controller/PdaVersionController.java
+++ b/src/main/java/com/ruoyi/other/controller/PdaVersionController.java
@@ -1,6 +1,8 @@
 package com.ruoyi.other.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.other.dto.PdaVersionDTO;
 import com.ruoyi.other.pojo.PdaVersion;
@@ -23,6 +25,7 @@
     }
 
     @Operation(summary = "娣诲姞鐗堟湰")
+    @Log(title = "PDA鐗堟湰-娣诲姞", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public R add(@RequestBody PdaVersionDTO pdaVersion) {
         return R.ok(pdaVersionService.add(pdaVersion));
diff --git a/src/main/java/com/ruoyi/procurementrecord/bean/dto/ReturnManagementDto.java b/src/main/java/com/ruoyi/procurementrecord/bean/dto/ReturnManagementDto.java
index 98eb5da..539f3c7 100644
--- a/src/main/java/com/ruoyi/procurementrecord/bean/dto/ReturnManagementDto.java
+++ b/src/main/java/com/ruoyi/procurementrecord/bean/dto/ReturnManagementDto.java
@@ -27,18 +27,6 @@
     @Schema(description = "鍏宠仈鍑哄簱鍗曞彿")
     private String shippingNo;
 
-    @Schema(description = "鍙戣揣绫诲瀷")
-    private Integer shippingType;
-
-    @Schema(description = "鍙戣揣杞︾墝鍙�")
-    private String truckPlateNo;
-
-    @Schema(description = "蹇�掑叕鍙�")
-    private String expressCompany;
-
-    @Schema(description = "蹇�掑崟鍙�")
-    private String expressNo;
-
     @Schema(description = "椤圭洰鍚嶇О")
     private String projectName;
 
@@ -47,8 +35,5 @@
 
     @Schema(description = "閿�鍞骇鍝佸璞℃暟缁�")
     private List<ReturnSaleProductDto> returnSaleProducts;
-
-    @Schema(description = "閿�鍞��璐у叆搴撳鎵圭姸鎬�")
-    private Integer stockInApprovalStatus;
 
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/bean/dto/ReturnSaleProductDto.java b/src/main/java/com/ruoyi/procurementrecord/bean/dto/ReturnSaleProductDto.java
index b24ad14..6cfae1b 100644
--- a/src/main/java/com/ruoyi/procurementrecord/bean/dto/ReturnSaleProductDto.java
+++ b/src/main/java/com/ruoyi/procurementrecord/bean/dto/ReturnSaleProductDto.java
@@ -35,7 +35,4 @@
 
     @Schema(description = "鍙戣揣鍑哄簱鏁伴噺")
     private BigDecimal stockOutNum;
-
-    @Schema(description = "寰呭鐞嗛��璐ф暟閲�")
-    private BigDecimal pendingReturnNum;
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/bean/vo/ShippingProductVo.java b/src/main/java/com/ruoyi/procurementrecord/bean/vo/ShippingProductVo.java
index 760d83f..9f87aef 100644
--- a/src/main/java/com/ruoyi/procurementrecord/bean/vo/ShippingProductVo.java
+++ b/src/main/java/com/ruoyi/procurementrecord/bean/vo/ShippingProductVo.java
@@ -40,7 +40,4 @@
 
     @Schema(description = "鍚◣鍗曚环")
     private BigDecimal taxInclusiveUnitPrice;
-
-    @Schema(description = "寰呭鐞嗛��璐ф暟閲�")
-    private BigDecimal pendingReturnNum;
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/GasTankWarningController.java b/src/main/java/com/ruoyi/procurementrecord/controller/GasTankWarningController.java
index ea214c2..7fe7c33 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/GasTankWarningController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/GasTankWarningController.java
@@ -3,6 +3,8 @@
 
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.procurementrecord.pojo.GasTankWarning;
 import com.ruoyi.procurementrecord.service.GasTankWarningService;
@@ -23,23 +25,26 @@
         return AjaxResult.success(gasTankWarningService.listPage(page, gasTankWarning));
     }
 
+    @Log(title = "鏂板姘旂摱棰勮", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public AjaxResult add(@RequestBody GasTankWarning gasTankWarning) {
         return AjaxResult.success(gasTankWarningService.save(gasTankWarning));
     }
 
+    @Log(title = "淇敼姘旂摱棰勮", businessType = BusinessType.UPDATE)
     @PostMapping("update")
     public AjaxResult update(@RequestBody GasTankWarning gasTankWarning) {
         return AjaxResult.success(gasTankWarningService.updateById(gasTankWarning));
     }
 
+    @Log(title = "鍒犻櫎姘旂摱棰勮", businessType = BusinessType.DELETE)
     @DeleteMapping("delete")
     public AjaxResult delete(@RequestBody List<Long> ids) {
         if (CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
         return AjaxResult.success(gasTankWarningService.removeByIds(ids));
     }
 
-    //瀵煎嚭
+    @Log(title = "瀵煎嚭姘旂摱棰勮", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response, @RequestParam(name = "ids", required = false) List<Long> ids) {
         gasTankWarningService.export(response, ids);
diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/InboundManagementController.java b/src/main/java/com/ruoyi/procurementrecord/controller/InboundManagementController.java
index 0a2919d..7fdc5ca 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/InboundManagementController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/InboundManagementController.java
@@ -3,6 +3,8 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.procurementrecord.pojo.InboundManagement;
@@ -35,6 +37,7 @@
         return AjaxResult.success(result);
     }
 
+    @Log(title = "鏂板鍒拌揣绠$悊", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     @Operation(summary = "鍒拌揣绠$悊-娣诲姞")
     @Transactional(rollbackFor = Exception.class)
@@ -44,6 +47,7 @@
         return result ? AjaxResult.success() : AjaxResult.error();
     }
 
+    @Log(title = "淇敼鍒拌揣绠$悊", businessType = BusinessType.UPDATE)
     @PostMapping("/update")
     @Operation(summary = "鍒拌揣绠$悊-淇敼")
     @Transactional(rollbackFor = Exception.class)
@@ -52,6 +56,7 @@
         return result ? AjaxResult.success() : AjaxResult.error();
     }
 
+    @Log(title = "鍒犻櫎鍒拌揣绠$悊", businessType = BusinessType.DELETE)
     @DeleteMapping("/del")
     @Operation(summary = "鍒拌揣绠$悊-鍒犻櫎")
     @Transactional(rollbackFor = Exception.class)
diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementExceptionRecordController.java b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementExceptionRecordController.java
index bb14493..ebe14f1 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementExceptionRecordController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementExceptionRecordController.java
@@ -1,5 +1,7 @@
 package com.ruoyi.procurementrecord.controller;
 
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.procurementrecord.mapper.ProcurementExceptionRecordMapper;
@@ -21,12 +23,14 @@
 
     private ProcurementExceptionRecordMapper procurementExceptionRecordMapper;
 
+    @Log(title = "鏂板閲囪喘寮傚父璁板綍", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     @Transactional
     public AjaxResult add(@RequestBody ProcurementExceptionRecord procurementExceptionRecord) {
         return AjaxResult.success(procurementExceptionRecordMapper.insert(procurementExceptionRecord));
     }
 
+    @Log(title = "淇敼閲囪喘寮傚父璁板綍", businessType = BusinessType.UPDATE)
     @PostMapping("/update")
     @Transactional
     public AjaxResult updatePro(@RequestBody ProcurementExceptionRecord procurementExceptionRecord) {
diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPlanController.java b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPlanController.java
index 1d442a9..f156c94 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPlanController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPlanController.java
@@ -2,6 +2,8 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.procurementrecord.pojo.ProcurementPlan;
@@ -33,6 +35,7 @@
         return AjaxResult.success(result);
     }
 
+    @Log(title = "鏂板閲囪喘璁″垝", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     @Operation(summary = "閲囪喘璁″垝-娣诲姞")
     public AjaxResult add(@RequestBody ProcurementPlan procurementPlan){
@@ -40,6 +43,7 @@
         return result ? AjaxResult.success() : AjaxResult.error();
     }
 
+    @Log(title = "淇敼閲囪喘璁″垝", businessType = BusinessType.UPDATE)
     @PostMapping("/update")
     @Operation(summary = "閲囪喘璁″垝-淇敼")
     public AjaxResult update(@RequestBody ProcurementPlan procurementPlan){
@@ -47,6 +51,7 @@
         return result ? AjaxResult.success() : AjaxResult.error();
     }
 
+    @Log(title = "鍒犻櫎閲囪喘璁″垝", businessType = BusinessType.DELETE)
     @DeleteMapping("/del")
     @Operation(summary = "閲囪喘璁″垝-鍒犻櫎")
     public AjaxResult del(@RequestBody List<Long> ids){
@@ -54,10 +59,7 @@
         return result ? AjaxResult.success() : AjaxResult.error();
     }
 
-    /**
-     * 瀵煎嚭
-     * @param response
-     */
+    @Log(title = "瀵煎嚭閲囪喘璁″垝", businessType = BusinessType.EXPORT)
     @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
index 678446c..cc9f74c 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPriceManagementController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPriceManagementController.java
@@ -2,6 +2,8 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.procurementrecord.pojo.ProcurementPriceManagement;
@@ -34,6 +36,7 @@
         return AjaxResult.success(result);
     }
 
+    @Log(title = "鏂板閲囪喘浠锋牸绠$悊", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     @Operation(summary = "閲囪喘浠锋牸绠$悊-娣诲姞")
     @Transactional(rollbackFor = Exception.class)
@@ -42,6 +45,7 @@
         return result ? AjaxResult.success() : AjaxResult.error();
     }
 
+    @Log(title = "淇敼閲囪喘浠锋牸绠$悊", businessType = BusinessType.UPDATE)
     @PostMapping("/update")
     @Operation(summary = "閲囪喘浠锋牸绠$悊-淇敼")
     @Transactional(rollbackFor = Exception.class)
@@ -50,6 +54,7 @@
         return result ? AjaxResult.success() : AjaxResult.error();
     }
 
+    @Log(title = "鍒犻櫎閲囪喘浠锋牸绠$悊", businessType = BusinessType.DELETE)
     @DeleteMapping("/del")
     @Operation(summary = "閲囪喘浠锋牸绠$悊-鍒犻櫎")
     @Transactional(rollbackFor = Exception.class)
@@ -61,10 +66,7 @@
         return result ? AjaxResult.success() : AjaxResult.error();
     }
 
-    /**
-     * 瀵煎嚭
-     * @param response
-     */
+    @Log(title = "瀵煎嚭閲囪喘浠锋牸绠$悊", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response) {
         procurementPriceManagementService.export(response);
diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/ReturnManagementController.java b/src/main/java/com/ruoyi/procurementrecord/controller/ReturnManagementController.java
index 6387006..129277a 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/ReturnManagementController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/ReturnManagementController.java
@@ -8,6 +8,8 @@
 import com.ruoyi.account.pojo.AccountStatementDetails;
 import com.ruoyi.account.service.AccountStatementDetailsService;
 import com.ruoyi.common.exception.ServiceException;
+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.procurementrecord.bean.dto.ReturnManagementDto;
@@ -45,6 +47,7 @@
         return AjaxResult.success(result);
     }
 
+    @Log(title = "鏂板閿�鍞��璐�", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     @Operation(summary = "閿�鍞��璐�-娣诲姞")
     @Transactional(rollbackFor = Exception.class)
@@ -52,6 +55,7 @@
         return returnManagementService.addReturnManagementDto(returnManagementDto) ? success() : error();
     }
 
+    @Log(title = "淇敼閿�鍞��璐�", businessType = BusinessType.UPDATE)
     @PostMapping("/update")
     @Operation(summary = "閿�鍞��璐�-淇敼")
     @Transactional(rollbackFor = Exception.class)
@@ -68,6 +72,7 @@
     }
 
 
+    @Log(title = "鍒犻櫎閿�鍞��璐�", businessType = BusinessType.DELETE)
     @DeleteMapping("/del")
     @Operation(summary = "閿�鍞��璐�-鍒犻櫎")
     @Transactional(rollbackFor = Exception.class)
diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/ReturnSaleProductController.java b/src/main/java/com/ruoyi/procurementrecord/controller/ReturnSaleProductController.java
index e7826aa..fee4e76 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/ReturnSaleProductController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/ReturnSaleProductController.java
@@ -1,5 +1,7 @@
 package com.ruoyi.procurementrecord.controller;
 
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java b/src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java
index 934552e..f4e6709 100644
--- a/src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java
+++ b/src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java
@@ -97,6 +97,7 @@
     /**
      * 鍏ュ簱鏃堕棿
      */
+    @TableField(fill = FieldFill.INSERT)
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     private LocalDateTime createTime;
diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/ReturnManagement.java b/src/main/java/com/ruoyi/procurementrecord/pojo/ReturnManagement.java
index 5f04de8..4e8e3fb 100644
--- a/src/main/java/com/ruoyi/procurementrecord/pojo/ReturnManagement.java
+++ b/src/main/java/com/ruoyi/procurementrecord/pojo/ReturnManagement.java
@@ -34,18 +34,6 @@
     @Schema(description = "鍏宠仈鍑哄簱鍗曞彿Id")
     private Long shippingId;
 
-    @Schema(description = "鍙戣揣绫诲瀷 1璐ц溅 2蹇��")
-    private Integer shippingType;
-
-    @Schema(description = "鍙戣揣杞︾墝鍙�")
-    private String truckPlateNo;
-
-    @Schema(description = "蹇�掑叕鍙�")
-    private String expressCompany;
-
-    @Schema(description = "蹇�掑崟鍙�")
-    private String expressNo;
-
     @Schema(description = "椤圭洰id")
     private Long projectId;
 
@@ -75,6 +63,7 @@
     @Schema(description = "鍒涘缓鏃堕棿")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @TableField(fill = FieldFill.INSERT)
     private LocalDateTime createTime;
     @Schema(description = "鏇存柊鏃堕棿")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
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 eeeda2f..cd81a8a 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -7,6 +7,7 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.basic.mapper.ProductModelMapper;
 import com.ruoyi.basic.pojo.ProductModel;
+import com.ruoyi.common.utils.AmountUtils;
 import com.ruoyi.common.utils.OrderUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
@@ -535,7 +536,7 @@
             Long aLong = customStorageMapper.selectCount(null);
             item.setInboundBatches(aLong.equals(0L) ? "绗�1鎵规(鑷畾涔夊叆搴�)" : "绗�"+ (aLong + 1) + "鎵规(鑷畾涔夊叆搴�)" );
             item.setCreateBy(loginUser.getNickName());
-            item.setCode(OrderUtils.countTodayByCreateTime(customStorageMapper, "", "code", item.getCreateTime() != null ? item.getCreateTime() : LocalDateTime.now()));
+            item.setCode(OrderUtils.countTodayByCreateTime(customStorageMapper, "", "code"));
             customStorageMapper.insert(item);
         });
         return AjaxResult.success("鑷畾涔夊叆搴撴垚鍔�");
@@ -708,7 +709,9 @@
             dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
             // 搴撳瓨浠峰��
             if(dto.getTaxInclusiveUnitPrice() != null){
-                dto.setTaxInclusiveTotalPrice(dto.getInboundNum0().multiply(dto.getTaxInclusiveUnitPrice()));
+                dto.setTaxInclusiveTotalPrice(AmountUtils.scaleAmount(
+                        dto.getInboundNum0().multiply(dto.getTaxInclusiveUnitPrice())
+                ));
             }
         }
         pageList.setRecords(procurementPageDtoCopyList);
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnManagementServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnManagementServiceImpl.java
index 6420622..5834e65 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnManagementServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnManagementServiceImpl.java
@@ -8,8 +8,6 @@
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.OrderUtils;
 import com.ruoyi.common.utils.SecurityUtils;
-
-import java.time.LocalDateTime;
 import com.ruoyi.procurementrecord.bean.dto.ReturnManagementDto;
 import com.ruoyi.procurementrecord.bean.dto.ReturnSaleProductDto;
 import com.ruoyi.procurementrecord.bean.vo.ShippingInfoVo;
@@ -20,6 +18,7 @@
 import com.ruoyi.procurementrecord.service.ReturnManagementService;
 import com.ruoyi.procurementrecord.service.ReturnSaleProductService;
 import com.ruoyi.procurementrecord.utils.StockUtils;
+import com.ruoyi.sales.mapper.SalesLedgerMapper;
 import com.ruoyi.sales.pojo.ShippingInfo;
 import com.ruoyi.sales.service.ShippingInfoService;
 import lombok.RequiredArgsConstructor;
@@ -31,7 +30,6 @@
 
 import java.math.BigDecimal;
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * @author :yys
@@ -45,6 +43,7 @@
     private final ReturnManagementMapper returnManagementMapper;
     private final ReturnSaleProductService returnSaleProductService;
     private final ShippingInfoService shippingInfoService;
+    private final SalesLedgerMapper salesLedgerMapper;
     private final SalesRefundAmountOrderService salesRefundAmountOrderService;
     private final StockUtils stockUtils;
 
@@ -57,7 +56,7 @@
     @Override
     public boolean addReturnManagementDto(ReturnManagementDto returnManagementDto) {
         if (ObjectUtils.isEmpty(returnManagementDto.getReturnNo())){
-            String rt = OrderUtils.countTodayByCreateTime(returnManagementMapper, "RT","return_no", returnManagementDto.getCreateTime() != null ? returnManagementDto.getCreateTime() : LocalDateTime.now());
+            String rt = OrderUtils.countTodayByCreateTime(returnManagementMapper, "RT","return_no");
             returnManagementDto.setReturnNo(rt);
         }
         save(returnManagementDto);
@@ -99,36 +98,31 @@
     public boolean handle(Long returnManagementId) {
         ReturnManagement byId = this.getById(returnManagementId);
         List<ReturnSaleProductDto> list = returnSaleProductService.listReturnSaleProduct(returnManagementId);
-
-        // 1. 璁$畻姝g‘鐨勯��娆炬�婚锛堥噾棰�=鍗曚环脳鏁伴噺锛�
-        BigDecimal totalRefund = BigDecimal.ZERO;
-        for (ReturnSaleProductDto returnSaleProduct : list) {
-            BigDecimal itemAmount = returnSaleProduct.getAmount() != null
-                    ? returnSaleProduct.getAmount()
-                    : BigDecimal.ZERO;
-            totalRefund = totalRefund.add(itemAmount);
-            // 鏄惁鏈夎川閲忛棶棰�
-            if (returnSaleProduct.getIsQuality() == 1) {
-                stockUtils.addUnStockWithBatchNo(returnSaleProduct.getProductModelId(), returnSaleProduct.getNum(), StockInQualifiedRecordTypeEnum.RETURN_UNSTOCK_IN.getCode(), returnSaleProduct.getId(), returnSaleProduct.getBatchNo());
-            } else {
-                stockUtils.addStockWithBatchNo(returnSaleProduct.getProductModelId(), returnSaleProduct.getNum(), StockInQualifiedRecordTypeEnum.RETURN_HE_IN.getCode(), returnSaleProduct.getId(), returnSaleProduct.getBatchNo());
-            }
-        }
-
-        // 2. 鏇存柊閫�璐у崟鐘舵�佸拰閫�娆炬�婚
         byId.setStatus(1);
         byId.setSettler(SecurityUtils.getLoginUser().getNickName());
-        byId.setRefundAmount(totalRefund);
         updateById(byId);
-        //鏇存柊閫�璐т骇鍝佸垪琛ㄧ殑鐘舵��
-        List<ReturnSaleProduct> updateList = list.stream().map(m -> {
-            ReturnSaleProduct returnSaleProduct = new ReturnSaleProduct();
-            returnSaleProduct.setId(m.getId());
-            returnSaleProduct.setStatus(1);
-            return returnSaleProduct;
-        }).collect(Collectors.toList());
-        returnSaleProductService.updateBatchById(updateList);
-
+        SalesRefundAmountOrderDto salesRefundAmountOrder = new SalesRefundAmountOrderDto();
+        salesRefundAmountOrder.setReturnManagementId(returnManagementId);
+        salesRefundAmountOrder.setStatus(0);
+        salesRefundAmountOrder.setCreateTime(byId.getCreateTime());
+        salesRefundAmountOrder.setCreateUserId(SecurityUtils.getUserId());
+        BigDecimal bigDecimal = new BigDecimal(0);
+        for (ReturnSaleProductDto returnSaleProduct : list) {
+            bigDecimal = bigDecimal.add(returnSaleProduct.getPrice());
+            salesRefundAmountOrder.setRefundedAmount(new BigDecimal(0));
+            // 鏄惁鏈夎川閲忛棶棰�
+            if (returnSaleProduct.getIsQuality() == 1) {
+                // 鏈夎川閲忛棶棰橈紝鍏ヤ笉鍚堟牸搴�(甯︽壒娆�)
+                stockUtils.addUnStockWithBatchNo(returnSaleProduct.getProductModelId(),returnSaleProduct.getNum(), StockInQualifiedRecordTypeEnum.RETURN_UNSTOCK_IN.getCode(),returnSaleProduct.getId(),returnSaleProduct.getBatchNo());
+            }else{
+                // 鏃犺川閲忛棶棰橈紝鍏ュ悎鏍煎簱(甯︽壒娆�)
+                stockUtils.addStockWithBatchNo(returnSaleProduct.getProductModelId(),returnSaleProduct.getNum(), StockInQualifiedRecordTypeEnum.RETURN_HE_IN.getCode(),returnSaleProduct.getId(),returnSaleProduct.getBatchNo());
+            }
+        }
+        salesRefundAmountOrder.setRefundAmount(bigDecimal);
+        salesRefundAmountOrder.setNotRefundedAmount(salesRefundAmountOrder.getRefundedAmount());
+        // 鍒嗘壒閫�娆�
+//        salesRefundAmountOrderService.addSalesRefundAmountOrderDto(salesRefundAmountOrder);
         return true;
     }
 
diff --git a/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java b/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
index 6c56359..15dad45 100644
--- a/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
+++ b/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
@@ -2,11 +2,16 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.common.enums.ReviewStatusEnum;
+import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
 import com.ruoyi.stock.dto.StockInventoryDto;
+import com.ruoyi.stock.dto.StockOutRecordDto;
 import com.ruoyi.stock.dto.StockUninventoryDto;
 import com.ruoyi.stock.pojo.StockInRecord;
 import com.ruoyi.stock.pojo.StockOutRecord;
@@ -18,7 +23,6 @@
 import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
-import java.time.LocalDateTime;
 import java.util.Collections;
 import java.util.List;
 
@@ -90,21 +94,11 @@
      * @param recordId
      */
     public void addStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId) {
-        addStock(productModelId, quantity, recordType, recordId, null);
-    }
-
-    /**
-     * 鍚堟牸鍏ュ簱
-     * @param recordType
-     * @param recordId
-     */
-    public void addStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId, LocalDateTime createTime) {
         StockInventoryDto stockInventoryDto = new StockInventoryDto();
         stockInventoryDto.setRecordId(recordId);
         stockInventoryDto.setRecordType(String.valueOf(recordType));
         stockInventoryDto.setQualitity(quantity);
         stockInventoryDto.setProductModelId(productModelId);
-        stockInventoryDto.setCreateTime(createTime);
         stockInventoryService.addStockInRecordOnly(stockInventoryDto);
     }
 
@@ -116,22 +110,12 @@
      * @param recordId
      */
     public void addStockWithBatchNo(Long productModelId, BigDecimal quantity, String recordType, Long recordId, String batchNo) {
-        addStockWithBatchNo(productModelId, quantity, recordType, recordId, batchNo, null);
-    }
-
-    /**
-     * 鍚堟牸鍏ュ簱甯︽壒娆″彿
-     * @param recordType
-     * @param recordId
-     */
-    public void addStockWithBatchNo(Long productModelId, BigDecimal quantity, String recordType, Long recordId, String batchNo, LocalDateTime createTime) {
         StockInventoryDto stockInventoryDto = new StockInventoryDto();
         stockInventoryDto.setRecordId(recordId);
         stockInventoryDto.setRecordType(String.valueOf(recordType));
         stockInventoryDto.setQualitity(quantity);
         stockInventoryDto.setProductModelId(productModelId);
         stockInventoryDto.setBatchNo(batchNo);
-        stockInventoryDto.setCreateTime(createTime);
         stockInventoryService.addStockInRecordOnly(stockInventoryDto);
     }
 
@@ -150,7 +134,8 @@
         stockInventoryDto.setQualitity(quantity);
         stockInventoryDto.setProductModelId(productModelId);
         stockInventoryDto.setBatchNo(batchNo);
-        stockInventoryService.addStockOutRecordOnly(stockInventoryDto);
+        StockOutRecordDto stockOutRecordDto = stockInventoryService.addStockOutRecordOnly(stockInventoryDto);
+        stockOutRecordService.batchApprove(Collections.singletonList(stockOutRecordDto.getId()),1);
     }
 
     /**
@@ -184,25 +169,17 @@
 
     //鍒犻櫎鍑哄簱璁板綍
     public void deleteStockOutRecord(Long recordId, String recordType) {
-        List<StockOutRecord> records = stockOutRecordService.list(new QueryWrapper<StockOutRecord>()
-                .lambda().eq(StockOutRecord::getRecordId, recordId)
+        List<StockOutRecord> list = stockOutRecordService.list(Wrappers.<StockOutRecord>lambdaQuery()
+                .eq(StockOutRecord::getRecordId, recordId)
                 .eq(StockOutRecord::getRecordType, recordType));
-        if (ObjectUtils.isEmpty(records)) {
-            return;
-        }
-        List<Long> approvedIds = records.stream()
-                .filter(one -> ReviewStatusEnum.APPROVED.getCode().equals(one.getApprovalStatus()))
-                .map(StockOutRecord::getId)
-                .toList();
-        List<Long> pendingIds = records.stream()
-                .filter(one -> !ReviewStatusEnum.APPROVED.getCode().equals(one.getApprovalStatus()))
-                .map(StockOutRecord::getId)
-                .toList();
-        if (!approvedIds.isEmpty()) {
-            stockOutRecordService.batchDelete(approvedIds);
-        }
-        if (!pendingIds.isEmpty()) {
-            stockOutRecordService.removeByIds(pendingIds);
+        if (CollectionUtils.isNotEmpty(list)) {
+            for (StockOutRecord one : list) {
+                if (ReviewStatusEnum.APPROVED.getCode().equals(one.getApprovalStatus())) {
+                    stockOutRecordService.batchDelete(Collections.singletonList(one.getId()));
+                } else {
+                    stockOutRecordService.removeById(one.getId());
+                }
+            }
         }
 
     }
diff --git a/src/main/java/com/ruoyi/production/bean/dto/ProductionPlanImportDto.java b/src/main/java/com/ruoyi/production/bean/dto/ProductionPlanImportDto.java
index 62b50da..5dd5160 100644
--- a/src/main/java/com/ruoyi/production/bean/dto/ProductionPlanImportDto.java
+++ b/src/main/java/com/ruoyi/production/bean/dto/ProductionPlanImportDto.java
@@ -36,6 +36,10 @@
     @Excel(name = "闇�姹傛暟閲�")
     private BigDecimal qtyRequired;
 
+    @Schema(description = "鏉ユ簮 閿�鍞�/鍐呴儴")
+    @Excel(name = "鏉ユ簮 閿�鍞�/鍐呴儴")
+    private String source;
+
     @Schema(description = "鎵胯鏃ユ湡")
     @Excel(name = "鎵胯鏃ユ湡")
     private LocalDate promisedDeliveryDate;
diff --git a/src/main/java/com/ruoyi/production/bean/vo/ProcessRouteStatusVo.java b/src/main/java/com/ruoyi/production/bean/vo/ProcessRouteStatusVo.java
new file mode 100644
index 0000000..ae22fb1
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/bean/vo/ProcessRouteStatusVo.java
@@ -0,0 +1,17 @@
+package com.ruoyi.production.bean.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@Schema(name = "ProcessRouteStatusVo", description = "宸ュ簭鐢熶骇杩涘害椤�")
+public class ProcessRouteStatusVo {
+
+    @Schema(description = "宸ュ簭鍚嶇О")
+    private String name;
+
+    @Schema(description = "瀹屾垚杩涘害鐧惧垎姣�")
+    private BigDecimal percentage;
+}
diff --git a/src/main/java/com/ruoyi/production/bean/vo/ProductionOrderProcessTaskVo.java b/src/main/java/com/ruoyi/production/bean/vo/ProductionOrderProcessTaskVo.java
new file mode 100644
index 0000000..47d78c8
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/bean/vo/ProductionOrderProcessTaskVo.java
@@ -0,0 +1,20 @@
+package com.ruoyi.production.bean.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@Schema(name = "ProductionOrderProcessTaskVo", description = "鐢熶骇璁㈠崟宸ュ簭浠诲姟杩涘害")
+public class ProductionOrderProcessTaskVo {
+
+    @Schema(description = "鐢熶骇璁㈠崟ID")
+    private Long productionOrderId;
+
+    @Schema(description = "宸ュ簭鍚嶇О")
+    private String operationName;
+
+    @Schema(description = "瀹屾垚杩涘害")
+    private BigDecimal completionStatus;
+}
diff --git a/src/main/java/com/ruoyi/production/bean/vo/ProductionOrderVo.java b/src/main/java/com/ruoyi/production/bean/vo/ProductionOrderVo.java
index 01ef33a..9a8fa5f 100644
--- a/src/main/java/com/ruoyi/production/bean/vo/ProductionOrderVo.java
+++ b/src/main/java/com/ruoyi/production/bean/vo/ProductionOrderVo.java
@@ -44,4 +44,7 @@
 
     @Schema(description = "鏄惁宸查��鏂�")
     private Boolean returned;
+
+    @Schema(description = "宸ュ簭鐢熶骇杩涘害")
+    private List<ProcessRouteStatusVo> processRouteStatus;
 }
diff --git a/src/main/java/com/ruoyi/production/controller/ProductionBomStructureController.java b/src/main/java/com/ruoyi/production/controller/ProductionBomStructureController.java
index dd1d50e..0f48902 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductionBomStructureController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductionBomStructureController.java
@@ -1,5 +1,7 @@
 package com.ruoyi.production.controller;
 
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.production.bean.dto.ProductionBomStructureDto;
 import com.ruoyi.production.bean.vo.ProductionBomStructureVo;
@@ -31,6 +33,7 @@
         return R.ok(productionBomStructureService.listByBomId(bomId));
     }
 
+    @Log(title = "鏂板鎴栦慨鏀笲OM缁撴瀯", businessType = BusinessType.UPDATE)
     @PostMapping("/addOrUpdateBomStructs")
     @Operation(summary = "鏂板鎴栦慨鏀笲OM缁撴瀯")
     public R addProductionBomStructure(@RequestBody ProductionBomStructureDto productionBomStructureDto) {
diff --git a/src/main/java/com/ruoyi/production/controller/ProductionOperationTaskController.java b/src/main/java/com/ruoyi/production/controller/ProductionOperationTaskController.java
index 56ed8c2..31fa3f5 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductionOperationTaskController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductionOperationTaskController.java
@@ -1,5 +1,7 @@
 package com.ruoyi.production.controller;
 
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.production.bean.dto.ProductionOperationTaskDto;
@@ -40,36 +42,42 @@
         return R.ok(productionOperationTaskService.getProductionOperationTaskInfo(id));
     }
 
+    @Log(title = "鏂板宸ュ崟", businessType = BusinessType.INSERT)
     @PostMapping
     @Operation(summary = "鏂板宸ュ崟")
     public R<Boolean> add(@RequestBody ProductionOperationTask productionOperationTask) {
         return R.ok(productionOperationTaskService.saveProductionOperationTask(productionOperationTask));
     }
 
+    @Log(title = "淇敼宸ュ崟", businessType = BusinessType.UPDATE)
     @PutMapping
     @Operation(summary = "淇敼宸ュ崟")
     public R<Boolean> edit(@RequestBody ProductionOperationTask productionOperationTask) {
         return R.ok(productionOperationTaskService.saveProductionOperationTask(productionOperationTask));
     }
 
+    @Log(title = "鍒犻櫎宸ュ崟", businessType = BusinessType.DELETE)
     @DeleteMapping("/delete")
     @Operation(summary = "鍒犻櫎宸ュ崟")
     public R<Boolean> remove(@RequestBody List<Long> ids) {
         return R.ok(productionOperationTaskService.removeProductionOperationTask(ids));
     }
 
+    @Log(title = "浜у搧宸ュ崟鏇存柊", businessType = BusinessType.UPDATE)
     @Operation(summary = "浜у搧宸ュ崟鏇存柊")
     @PostMapping("/updateProductWorkOrder")
     public R updateProductWorkOrder(@RequestBody ProductionOperationTaskDto dto) {
         return R.ok(productionOperationTaskService.updateProductWorkOrder(dto));
     }
 
+    @Log(title = "鎸囨淳鎶ュ伐浜�", businessType = BusinessType.UPDATE)
     @Operation(summary = "鎸囨淳鎶ュ伐浜�")
     @PostMapping("/assign")
     public R<Boolean> assign(@RequestBody ProductionOperationTaskDto dto) {
         return R.ok(productionOperationTaskService.assign(dto));
     }
 
+    @Log(title = "宸ュ崟娴佽浆鍗′笅杞�", businessType = BusinessType.EXPORT)
     @PostMapping("/down")
     @Operation(summary = "宸ュ崟娴佽浆鍗′笅杞�")
     public void down(HttpServletResponse response, @RequestBody ProductionOperationTaskDto dto) {
diff --git a/src/main/java/com/ruoyi/production/controller/ProductionOrderController.java b/src/main/java/com/ruoyi/production/controller/ProductionOrderController.java
index 0a68875..cb65252 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductionOrderController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductionOrderController.java
@@ -53,6 +53,7 @@
         return R.ok(productionOrderService.getProductionOrderInfo(id));
     }
 
+    @Log(title = "鐢熶骇宸ュ崟", businessType = BusinessType.INSERT)
     @PostMapping("/addOrder")
     @Operation(summary = "鏂板鐢熶骇璁㈠崟", description = "鏂板涓嬪崟鍙敮鎸�1绉嶆柟寮忥細鐢熶骇璁″垝鐢熸垚锛屼紶 productionPlanIds锛岀郴缁熻嚜鍔ㄦ眹鎬昏鍒掑緱鍒颁骇鍝佽鏍煎拰鏁伴噺锛�"
                     + "technologyRoutingId 涓虹┖鏃朵細鑷姩鍖归厤璇ヤ骇鍝佽鏍兼渶鏂板伐鑹鸿矾绾匡紝quantity 鏈�缁堝繀椤诲ぇ浜� 0銆�")
@@ -62,18 +63,21 @@
         return R.ok(productionOrderService.saveProductionOrder(productionOrder));
     }
 
+    @Log(title = "鐢熶骇宸ュ崟", businessType = BusinessType.UPDATE)
     @Operation(summary = "缁戝畾宸ヨ壓璺嚎")
     @PostMapping("/bindingRoute")
     public R bindingRoute(@RequestBody ProductionOrderDto productionOrderDto) {
         return R.ok(productionOrderService.bindingRoute(productionOrderDto));
     }
 
+    @Log(title = "鐢熶骇宸ュ崟", businessType = BusinessType.UPDATE)
     @PostMapping("/syncSnapshot/{id}")
     @Operation(summary = "鍚屾鐢熶骇璁㈠崟宸ヨ壓/BOM蹇収")
     public R<Integer> syncSnapshot(@PathVariable Long id) {
         return R.ok(productionOrderService.syncProductionOrderSnapshot(id));
     }
 
+    @Log(title = "鐢熶骇宸ュ崟", businessType = BusinessType.DELETE)
     @DeleteMapping("/delete")
     @Operation(summary = "鍒犻櫎鐢熶骇璁㈠崟")
     public R<Boolean> remove(@RequestBody List<Long> ids) {
@@ -98,6 +102,7 @@
         return R.ok(productionOrderService.getWorkOrderReportInspectDetail(productionOrderDto));
     }
 
+    @Log(title = "鐢熶骇宸ュ崟", businessType = BusinessType.UPDATE)
     @Operation(summary = "鏇存柊璁㈠崟鐘舵��")
     @PostMapping("/updateOrder")
     public R updateOrder(@RequestBody ProductionOrderDto productionOrderDto) {
diff --git a/src/main/java/com/ruoyi/production/controller/ProductionOrderPickController.java b/src/main/java/com/ruoyi/production/controller/ProductionOrderPickController.java
index a8e2d2e..ec63f47 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductionOrderPickController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductionOrderPickController.java
@@ -1,5 +1,7 @@
 package com.ruoyi.production.controller;
 
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.production.bean.dto.ProductionOrderPickDto;
 import com.ruoyi.production.bean.vo.ProductionOrderPickVo;
@@ -27,12 +29,14 @@
 
     private final ProductionOrderPickService productionOrderPickService;
 
+    @Log(title = "棰嗘枡淇濆瓨鍒扮嚎杈逛粨", businessType = BusinessType.INSERT)
     @PostMapping("/savePick")
     @Operation(summary = "棰嗘枡淇濆瓨鍒扮嚎杈逛粨")
     public R<Boolean> savePick(@RequestBody ProductionOrderPickDto dto) {
         return R.ok(productionOrderPickService.savePick(dto));
     }
 
+    @Log(title = "鍙樻洿棰嗘枡", businessType = BusinessType.UPDATE)
     @PostMapping("/updatePick")
     @Operation(summary = "鍙樻洿棰嗘枡")
     public R<Boolean> updatePick(@RequestBody ProductionOrderPickDto dto) {
diff --git a/src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingController.java b/src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingController.java
index 833e737..277f949 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingController.java
@@ -1,5 +1,7 @@
 package com.ruoyi.production.controller;
 
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.production.pojo.ProductionOrderRoutingOperation;
 import com.ruoyi.production.service.ProductionOrderRoutingOperationService;
@@ -30,24 +32,28 @@
         return R.ok(productionOrderRoutingService.listMain(orderId));
     }
 
+    @Log(title = "鐢熶骇宸ュ簭璺敱", businessType = BusinessType.INSERT)
     @PostMapping("/addRouteItem")
     @Operation(summary = "鏂板鐢熶骇璁㈠崟鐨勫伐鑹鸿矾绾胯鎯�")
     public R addRouteItem(@RequestBody ProductionOrderRoutingOperation productionOrderRoutingOperation) {
         return productionOrderRoutingOperationService.addRouteItem(productionOrderRoutingOperation);
     }
 
+    @Log(title = "鐢熶骇宸ュ簭璺敱", businessType = BusinessType.UPDATE)
     @PostMapping("/updateRouteItem")
     @Operation(summary = "淇敼鐢熶骇璁㈠崟鐨勫伐鑹鸿矾绾胯鎯�")
     public R updateRouteItem(@RequestBody ProductionOrderRoutingOperation productionOrderRoutingOperation) {
-        return productionOrderRoutingOperationService.updateRouteItem(productionOrderRoutingOperation);
+        return R.ok(productionOrderRoutingOperationService.updateRouteItem(productionOrderRoutingOperation));
     }
 
+    @Log(title = "鐢熶骇宸ュ簭璺敱", businessType = BusinessType.DELETE)
     @DeleteMapping("/deleteRouteItem/{id}")
     @Operation(summary = "鍒犻櫎鐢熶骇宸ヨ壓璺嚎")
     public R deleteRouteItem(@PathVariable("id") Long id) {
         return productionOrderRoutingOperationService.deleteRouteItem(id);
     }
 
+    @Log(title = "鐢熶骇宸ュ簭璺敱", businessType = BusinessType.UPDATE)
     @PostMapping("/sortRouteItem")
     @Operation(summary = "鎺掑簭")
     public R sortRouteItem(@RequestBody ProductionOrderRoutingOperation productionOrderRoutingOperation) {
diff --git a/src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingOperationParamController.java b/src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingOperationParamController.java
index fd229ef..dfd3547 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingOperationParamController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingOperationParamController.java
@@ -2,6 +2,8 @@
 
 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.R;
 import com.ruoyi.production.bean.dto.ProductionOrderRoutingOperationParamDto;
 import com.ruoyi.production.bean.vo.ProductionOrderRoutingOperationParamVo;
@@ -41,18 +43,21 @@
         return R.ok(productionOrderRoutingOperationParamService.getProductionOrderRoutingOperationParamInfo(id));
     }
 
+    @Log(title = "鐢熶骇宸ュ簭鍙傛暟", businessType = BusinessType.INSERT)
     @PostMapping
     @Operation(summary = "鏂板鐢熶骇璁㈠崟宸ヨ壓璺嚎宸ュ簭鍙傛暟")
     public R<Boolean> add(@RequestBody ProductionOrderRoutingOperationParam item) {
         return R.ok(productionOrderRoutingOperationParamService.saveProductionOrderRoutingOperationParam(item));
     }
 
+    @Log(title = "鐢熶骇宸ュ簭鍙傛暟", businessType = BusinessType.UPDATE)
     @PutMapping
     @Operation(summary = "淇敼鐢熶骇璁㈠崟宸ヨ壓璺嚎宸ュ簭鍙傛暟")
     public R<Boolean> edit(@RequestBody ProductionOrderRoutingOperationParam item) {
         return R.ok(productionOrderRoutingOperationParamService.updateById(item));
     }
 
+    @Log(title = "鐢熶骇宸ュ簭鍙傛暟", businessType = BusinessType.DELETE)
     @DeleteMapping("/{id}")
     @Operation(summary = "鍒犻櫎鐢熶骇璁㈠崟宸ヨ壓璺嚎宸ュ簭鍙傛暟")
     public R<Boolean> remove(@PathVariable("id") Long id) {
diff --git a/src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java b/src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java
index 926a59f..341026d 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java
@@ -2,6 +2,8 @@
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.production.bean.dto.ProductionProductMainDto;
 import com.ruoyi.production.service.ProductionProductMainService;
@@ -50,30 +52,35 @@
      * @param productionProductMainDto
      * @return
      */
+    @Log(title = "鐢熶骇浜у搧", businessType = BusinessType.INSERT)
     @PostMapping("/addProductMain")
     @PreAuthorize("@ss.hasPermi('productionProductMain:add')")
     public R addProductMain(@RequestBody ProductionProductMainDto productionProductMainDto) {
         return R.ok(productionProductMainService.addProductMain(productionProductMainDto));
     }
 
+    @Log(title = "鐢熶骇浜у搧", businessType = BusinessType.INSERT)
     @PostMapping
     @Operation(summary = "鏂板鐢熶骇鎶ュ伐")
     public R add(@RequestBody ProductionProductMainDto productionProductMainDto) {
         return R.ok(productionProductMainService.saveProductionProductMain(productionProductMainDto));
     }
 
+    @Log(title = "鐢熶骇浜у搧", businessType = BusinessType.UPDATE)
     @PutMapping
     @Operation(summary = "淇敼鐢熶骇鎶ュ伐")
     public R edit(@RequestBody ProductionProductMainDto productionProductMainDto) {
         return R.ok(productionProductMainService.saveProductionProductMain(productionProductMainDto));
     }
 
+    @Log(title = "鐢熶骇浜у搧", businessType = BusinessType.DELETE)
     @Operation(summary = "鍒犻櫎鎶ュ伐")
     @DeleteMapping("/delete")
     public R delete(@RequestBody ProductionProductMainDto productionProductMainDto) {
         return R.ok(productionProductMainService.removeProductMain(productionProductMainDto.getId()));
     }
 
+    @Log(title = "鐢熶骇浜у搧", businessType = BusinessType.DELETE)
     @DeleteMapping("/{id}")
     @Operation(summary = "鍒犻櫎鐢熶骇鎶ュ伐")
     public R remove(@PathVariable("id") Long id) {
@@ -84,6 +91,7 @@
     /**
      * 瀵煎嚭
      */
+    @Log(title = "鐢熶骇浜у搧", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response, ProductionProductMainDto productionProductMainDto) {
         List<ProductionProductMainDto> list;
diff --git a/src/main/java/com/ruoyi/production/enums/ProductOrderStatusEnum.java b/src/main/java/com/ruoyi/production/enums/ProductOrderStatusEnum.java
index 631b2b0..5ad55c3 100644
--- a/src/main/java/com/ruoyi/production/enums/ProductOrderStatusEnum.java
+++ b/src/main/java/com/ruoyi/production/enums/ProductOrderStatusEnum.java
@@ -17,8 +17,7 @@
     WAIT(1, "寰呭紑濮�"),
     RUNNING(2, "杩涜涓�"),
     FINISHED(3, "宸插畬鎴�"),
-    //CANCEL(4, "宸插彇娑�"),
-    END(5, "宸茬粨鏉�");
+    CANCEL(4, "宸插彇娑�");
 
     private final Integer code;
     private final String desc;
@@ -44,10 +43,10 @@
     }
 
     /**
-     * 鍒ゆ柇鏄惁鍏佽鍒犻櫎锛�1锛�
+     * 鍒ゆ柇鏄惁鍏佽鍒犻櫎锛�4锛�
      */
     public static boolean canDelete(Integer code) {
-        return WAIT.getCode().equals(code);
+        return WAIT.getCode().equals(code) || CANCEL.getCode().equals(code);
     }
 
     /**
@@ -58,9 +57,9 @@
     }
 
     /**
-     * 鍒ゆ柇鏄惁宸插紑濮嬬敓浜э紙2銆�3銆�5锛�
+     * 鍒ゆ柇鏄惁宸插紑濮嬬敓浜э紙2銆�3锛�
      */
     public static boolean isStarted(Integer code) {
-        return RUNNING.getCode().equals(code) || FINISHED.getCode().equals(code) || END.getCode().equals(code);
+        return RUNNING.getCode().equals(code) || FINISHED.getCode().equals(code);
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductionOperationTaskMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductionOperationTaskMapper.java
index a09dd6f..ab38d55 100644
--- a/src/main/java/com/ruoyi/production/mapper/ProductionOperationTaskMapper.java
+++ b/src/main/java/com/ruoyi/production/mapper/ProductionOperationTaskMapper.java
@@ -7,6 +7,7 @@
 import com.ruoyi.home.dto.processDataProductionStatisticsDto;
 import com.ruoyi.production.bean.dto.ProductionOperationTaskDto;
 import com.ruoyi.production.bean.vo.ProductionOperationTaskVo;
+import com.ruoyi.production.bean.vo.ProductionOrderProcessTaskVo;
 import com.ruoyi.production.pojo.ProductionOperationTask;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -43,4 +44,6 @@
     ProductionOperationTaskDto getProductWorkOrderFlowCard(@Param("id") Long id);
 
     List<ProductionOperationTaskVo> getOperation(@Param("c") ProductionOperationTaskDto dto);
+
+    List<ProductionOrderProcessTaskVo> listProcessStatusByOrderIds(@Param("orderIds") List<Long> orderIds);
 }
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionOrder.java b/src/main/java/com/ruoyi/production/pojo/ProductionOrder.java
index 6208146..e52ee9d 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionOrder.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionOrder.java
@@ -41,6 +41,7 @@
     private String npsNo;
 
     @Schema(description = "褰曞叆鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
     private LocalDateTime createTime;
 
     @Schema(description = "鏇存柊鏃堕棿")
diff --git a/src/main/java/com/ruoyi/production/service/ProductionOrderRoutingOperationService.java b/src/main/java/com/ruoyi/production/service/ProductionOrderRoutingOperationService.java
index e14b36f..8878006 100644
--- a/src/main/java/com/ruoyi/production/service/ProductionOrderRoutingOperationService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductionOrderRoutingOperationService.java
@@ -13,5 +13,4 @@
     R deleteRouteItem(Long id);
 
     int sortRouteItem(ProductionOrderRoutingOperation productionOrderRoutingOperation);
-
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationParamServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationParamServiceImpl.java
index a792b35..d66ebc7 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationParamServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationParamServiceImpl.java
@@ -161,21 +161,11 @@
         // 妫�鏌ユ暟鎹槸鍚﹂噸澶嶏紝閬垮厤閲嶅淇濆瓨
         boolean duplicate = productionOrderRoutingOperationParamMapper.selectCount(
                 Wrappers.<ProductionOrderRoutingOperationParam>lambdaQuery()
-                        .eq(ProductionOrderRoutingOperationParam::getProductionOrderId, item.getProductionOrderId())
                         .isNull(ProductionOrderRoutingOperationParam::getProductionProductMainId)
                         .eq(ProductionOrderRoutingOperationParam::getProductionOrderRoutingOperationId, item.getProductionOrderRoutingOperationId())
                         .eq(item.getTechnologyRoutingOperationParamId() != null,
                                 ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationParamId, item.getTechnologyRoutingOperationParamId())
-                        .eq(item.getTechnologyRoutingOperationParamId() == null && item.getTechnologyOperationParamId() != null,
-                                ProductionOrderRoutingOperationParam::getTechnologyOperationParamId, item.getTechnologyOperationParamId())
-                        .eq(item.getTechnologyRoutingOperationParamId() == null
-                                        && item.getTechnologyOperationParamId() == null
-                                        && item.getParamId() != null,
-                                ProductionOrderRoutingOperationParam::getParamId, item.getParamId())
-                        .eq(item.getTechnologyRoutingOperationParamId() == null
-                                        && item.getTechnologyOperationParamId() == null
-                                        && item.getParamId() == null
-                                        && item.getParamCode() != null,
+                        .eq(item.getTechnologyRoutingOperationParamId() == null && item.getParamCode() != null,
                                 ProductionOrderRoutingOperationParam::getParamCode, item.getParamCode())
                         .ne(item.getId() != null, ProductionOrderRoutingOperationParam::getId, item.getId())
         ) > 0;
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
index 1905d4a..caff402 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
@@ -22,6 +22,8 @@
 import com.ruoyi.production.bean.vo.ProductionOrderVo;
 import com.ruoyi.production.bean.vo.ProductionPlanVo;
 import com.ruoyi.production.bean.vo.ProductionOrderWorkOrderDetailVo;
+import com.ruoyi.production.bean.vo.ProcessRouteStatusVo;
+import com.ruoyi.production.bean.vo.ProductionOrderProcessTaskVo;
 import com.ruoyi.production.enums.ProductOrderStatusEnum;
 import com.ruoyi.production.mapper.*;
 import com.ruoyi.production.pojo.*;
@@ -44,7 +46,6 @@
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
-import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -87,6 +88,7 @@
         // 鍒嗛〉鏌ヨ鐢熶骇璁㈠崟
         Page<ProductionOrderVo> result = (Page<ProductionOrderVo>) baseMapper.pageProductionOrder(page, dto);
         fillProductImages(result.getRecords());
+        fillProcessRouteStatus(result.getRecords());
         return result;
     }
 
@@ -95,6 +97,7 @@
         // 鏌ヨ鐢熶骇璁㈠崟鍒楄〃
         List<ProductionOrderVo> records = baseMapper.listProductionOrder(dto);
         fillProductImages(records);
+        fillProcessRouteStatus(records);
         return records;
     }
 
@@ -116,7 +119,7 @@
         // 涓嬪崟鍏ュ彛缁熶竴琛ラ綈鏉ユ簮鍗曟嵁銆佽鍒掑拰宸ヨ壓淇℃伅锛岄伩鍏嶅墠绔垎鍒紶澶氬瀛楁銆�
         validateAndFillOrder(productionOrder, oldOrder);
         if (productionOrder.getNpsNo() == null || productionOrder.getNpsNo().trim().isEmpty()) {
-            productionOrder.setNpsNo(generateNextOrderNo(productionOrder.getCreateTime() != null ? productionOrder.getCreateTime() : LocalDateTime.now()));
+            productionOrder.setNpsNo(generateNextOrderNo());
         }
         if (productionOrder.getCompleteQuantity() == null) {
             productionOrder.setCompleteQuantity(BigDecimal.ZERO);
@@ -134,7 +137,7 @@
                 || !Objects.equals(oldOrder.getProductModelId(), productionOrder.getProductModelId())
                 || compareDecimal(oldOrder.getQuantity(), productionOrder.getQuantity()) != 0
                 || productionOrderRoutingMapper.selectCount(Wrappers.<ProductionOrderRouting>lambdaQuery()
-                        .eq(ProductionOrderRouting::getProductionOrderId, productionOrder.getId())) == 0);
+                .eq(ProductionOrderRouting::getProductionOrderId, productionOrder.getId())) == 0);
         if (needSync) {
             syncProductionOrderSnapshot(productionOrder.getId());
         }
@@ -260,7 +263,7 @@
         Map<String, BigDecimal> operationDemandedQuantityMap =
                 buildOperationDemandedQuantityMap(orderBomStructureList, rootProductModelId);
         Map<Long, String> operationNameMap = technologyOperationMapper.selectBatchIds(
-        // 閬嶅巻澶勭悊鏁版嵁骞剁粍瑁呯粨鏋�
+                        // 閬嶅巻澶勭悊鏁版嵁骞剁粍瑁呯粨鏋�
                         routingOperations.stream()
                                 .map(TechnologyRoutingOperation::getTechnologyOperationId)
                                 .filter(Objects::nonNull)
@@ -461,7 +464,7 @@
     private void clearProductionSnapshot(Long productionOrderId) {
         // 娓呯悊璁㈠崟宸茬敓鎴愮殑宸ヨ壓涓嶣OM蹇収鏁版嵁
         boolean hasPickRecord = productionOrderPickRecordMapper.selectCount(
-        // 鏌ヨ骞跺噯澶囦笟鍔℃暟鎹�
+                // 鏌ヨ骞跺噯澶囦笟鍔℃暟鎹�
                 Wrappers.<ProductionOrderPickRecord>lambdaQuery()
                         .eq(ProductionOrderPickRecord::getProductionOrderId, productionOrderId)) > 0;
         // 鍙傛暟涓庡墠缃潯浠舵牎楠�
@@ -471,7 +474,7 @@
         List<Long> taskIds = productionOperationTaskMapper.selectList(
                         Wrappers.<ProductionOperationTask>lambdaQuery()
                                 .eq(ProductionOperationTask::getProductionOrderId, productionOrderId))
-        // 閬嶅巻澶勭悊鏁版嵁骞剁粍瑁呯粨鏋�
+                // 閬嶅巻澶勭悊鏁版嵁骞剁粍瑁呯粨鏋�
                 .stream().map(ProductionOperationTask::getId).collect(Collectors.toList());
         if (!taskIds.isEmpty()) {
             // 宸叉湁鎶ュ伐璁板綍璇存槑璁㈠崟宸插紑宸ワ紝姝ゆ椂涓嶅厑璁稿啀閲嶅缓蹇収銆�
@@ -509,10 +512,9 @@
                 .orderByDesc(ProductionOrder::getId);
     }
 
-    private String generateNextOrderNo(LocalDateTime createTime) {
+    private String generateNextOrderNo() {
         // 鐢熸垚涓嬩竴涓敓浜ц鍗曞彿
-        LocalDate localDate = createTime.toLocalDate();
-        String datePrefix = localDate.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+        String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
         String prefix = "SC" + datePrefix;
         ProductionOrder latestOrder = this.getOne(Wrappers.<ProductionOrder>lambdaQuery()
                 .likeRight(ProductionOrder::getNpsNo, prefix)
@@ -814,6 +816,46 @@
         }
     }
 
+    private void fillProcessRouteStatus(List<ProductionOrderVo> records) {
+        if (records == null || records.isEmpty()) {
+            return;
+        }
+        List<Long> orderIds = records.stream()
+                .map(ProductionOrderVo::getId)
+                .filter(Objects::nonNull)
+                .distinct()
+                .collect(Collectors.toList());
+        if (orderIds.isEmpty()) {
+            return;
+        }
+
+        List<ProductionOrderProcessTaskVo> tasks = productionOperationTaskMapper.listProcessStatusByOrderIds(orderIds);
+        Map<Long, List<ProcessRouteStatusVo>> statusMap = new LinkedHashMap<>();
+        if (tasks != null) {
+            for (ProductionOrderProcessTaskVo task : tasks) {
+                if (task == null || task.getProductionOrderId() == null) {
+                    continue;
+                }
+                ProcessRouteStatusVo status = new ProcessRouteStatusVo();
+                status.setName(task.getOperationName() != null && !task.getOperationName().isBlank()
+                        ? task.getOperationName()
+                        : "鏈煡宸ュ簭");
+                BigDecimal percentage = task.getCompletionStatus() == null
+                        ? BigDecimal.ZERO
+                        : task.getCompletionStatus();
+                if (percentage.compareTo(new BigDecimal("100")) > 0) {
+                    percentage = new BigDecimal("100");
+                }
+                status.setPercentage(percentage);
+                statusMap.computeIfAbsent(task.getProductionOrderId(), key -> new ArrayList<>()).add(status);
+            }
+        }
+
+        for (ProductionOrderVo record : records) {
+            record.setProcessRouteStatus(statusMap.getOrDefault(record.getId(), Collections.emptyList()));
+        }
+    }
+
     private StorageBlobVO toStorageBlobVO(StorageBlob blob) {
         // 灏嗗瓨鍌ㄦ枃浠跺璞¤浆鎹负VO
         StorageBlobVO vo = BeanUtil.copyProperties(blob, StorageBlobVO.class);
@@ -841,7 +883,7 @@
                 new Page<ProductionOperationTaskVo>(1, -1), taskQuery);
         List<ProductionOperationTaskVo> workOrderList = workOrderPage == null || workOrderPage.getRecords() == null
                 ? Collections.emptyList()
-        // 閬嶅巻澶勭悊鏁版嵁骞剁粍瑁呯粨鏋�
+                // 閬嶅巻澶勭悊鏁版嵁骞剁粍瑁呯粨鏋�
                 : workOrderPage.getRecords().stream()
                 .filter(Objects::nonNull)
                 .sorted(Comparator.comparing(ProductionOperationTaskVo::getId, Comparator.nullsLast(Comparator.naturalOrder())))
@@ -857,7 +899,7 @@
                 .collect(Collectors.toList());
         List<ProductionProductMain> reportMainList = workOrderIdList.isEmpty()
                 ? Collections.emptyList()
-        // 鏌ヨ骞跺噯澶囦笟鍔℃暟鎹�
+                // 鏌ヨ骞跺噯澶囦笟鍔℃暟鎹�
                 : productionProductMainMapper.selectList(
                 Wrappers.<ProductionProductMain>lambdaQuery()
                         .in(ProductionProductMain::getProductionOperationTaskId, workOrderIdList)
@@ -1065,20 +1107,30 @@
             }
         }
 
-        // 杩囨护鍑洪潪鏍硅妭鐐癸紙瀹為檯棰嗘枡椤癸級
-        // 鎺掗櫎鎶曞叆鍝佷笌浜у嚭鍝佺浉鍚屼笖姣斾緥涓�1鐨勬儏鍐碉紙鑷韩鍔犲伐锛屼笉闇�瑕侀鏂欙級
+        // 鏀堕泦璁㈠崟鎴愬搧瑙勬牸ID锛氬寘鍚敓浜ц鍗曟垚鍝佽鏍间笌BOM鏍硅妭鐐硅鏍硷紝鐢ㄤ簬鎺掗櫎鈥滆嚜宸扁�濊繖涓�鐗╂枡
+        Set<Long> finishedProductModelIds = new HashSet<>();
+        if (productionOrder != null && productionOrder.getProductModelId() != null) {
+            finishedProductModelIds.add(productionOrder.getProductModelId());
+        }
+        bomStructureList.stream()
+                .filter(s -> s != null && (s.getParentId() == null || s.getParentId() == 0))
+                .map(ProductionBomStructureVo::getProductModelId)
+                .filter(Objects::nonNull)
+                .forEach(finishedProductModelIds::add);
+
+        // 鏀堕泦鎵�鏈夎寮曠敤涓虹埗绾х殑鑺傜偣ID锛欱OM浠庢渶鍚庝竴閬撳伐搴忓線閲岄厤缃墠涓�閬撳伐搴忥紝
+        // 涓棿鑺傜偣鏄笂涓�閬撳伐搴忕殑浜у嚭锛堣嚜鍒讹級锛屽彧鏈夋瘡鏉″垎鏀渶閲屽眰鐨勫彾瀛愯妭鐐规墠鏄湡姝i渶瑕侀鐢ㄧ殑鐗╂枡銆�
+        Set<Long> parentNodeIds = bomStructureList.stream()
+                .filter(s -> s != null && s.getParentId() != null && s.getParentId() != 0)
+                .map(ProductionBomStructureVo::getParentId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+
+        // 杩囨护鍑哄彾瀛愯妭鐐癸紙瀹為檯棰嗘枡椤癸級锛氶潪鏍硅妭鐐广�侀潪涓棿鑺傜偣锛屽苟鎺掗櫎涓庤鍗曟垚鍝佸悓瑙勬牸鐨勭墿鏂欙紙鑷埗鎴愬搧鏃犻渶棰嗘枡锛�
         List<ProductionBomStructureVo> childStructureList = bomStructureList.stream()
                 .filter(s -> s != null && s.getParentId() != null && s.getParentId() != 0)
-                .filter(s -> {
-                    ProductionBomStructureVo parent = structureByIdMap.get(s.getParentId());
-                    if (parent == null) {
-                        return true;
-                    }
-                    // 鎶曞叆鍝佷笌浜у嚭鍝佺浉鍚屼笖姣斾緥涓�1鏃讹紝涓嶉渶瑕侀鏂�
-                    boolean sameProduct = Objects.equals(s.getProductModelId(), parent.getProductModelId());
-                    boolean unitRatio = BigDecimal.ONE.compareTo(defaultDecimal(s.getUnitQuantity())) == 0;
-                    return !(sameProduct && unitRatio);
-                })
+                .filter(s -> s.getId() == null || !parentNodeIds.contains(s.getId()))
+                .filter(s -> s.getProductModelId() == null || !finishedProductModelIds.contains(s.getProductModelId()))
                 .collect(Collectors.toList());
 
         // 閬嶅巻澶勭悊鏁版嵁骞剁粍瑁呯粨鏋�
@@ -1092,7 +1144,8 @@
         if (!productModelIds.isEmpty()) {
             List<StockInventory> stockList = stockInventoryMapper.selectList(
                     Wrappers.<StockInventory>lambdaQuery()
-                            .in(StockInventory::getProductModelId, productModelIds));
+                            .in(StockInventory::getProductModelId, productModelIds)
+                            .gt(StockInventory::getQualitity, BigDecimal.ZERO));
             for (StockInventory stockItem : stockList) {
                 if (stockItem == null || stockItem.getProductModelId() == null) {
                     continue;
@@ -1106,35 +1159,40 @@
             }
         }
 
-        List<ProductionOrderPickVo> pickList = new ArrayList<>();
+        Map<String, ProductionOrderPickVo> mergedPickMap = new LinkedHashMap<>();
         for (ProductionBomStructureVo structure : childStructureList) {
             if (structure == null || structure.getProductModelId() == null) {
                 continue;
             }
             Long productModelId = structure.getProductModelId();
-            ProductionOrderPickVo vo = new ProductionOrderPickVo();
-            vo.setProductModelId(productModelId);
-            vo.setOperationName(structure.getOperationName());
-            vo.setTechnologyOperationId(structure.getTechnologyOperationId());
-            vo.setProductName(structure.getProductName());
-            vo.setModel(structure.getModel());
-            vo.setDemandedQuantity(defaultDecimal(structure.getDemandedQuantity()));
-            vo.setUnit(structure.getUnit());
-            List<String> batchNoList = stockBatchNoMap.get(productModelId) == null
-                    ? Collections.emptyList()
-                    : new ArrayList<>(stockBatchNoMap.get(productModelId));
-            vo.setBatchNoList(batchNoList);
-            vo.setStockQuantity(stockQuantityMap.getOrDefault(productModelId, BigDecimal.ZERO));
-            vo.setBom(true);
-            pickList.add(vo);
+            String mergeKey = String.valueOf(structure.getTechnologyOperationId()) + "#" + productModelId;
+            ProductionOrderPickVo vo = mergedPickMap.get(mergeKey);
+            if (vo == null) {
+                vo = new ProductionOrderPickVo();
+                vo.setProductModelId(productModelId);
+                vo.setOperationName(structure.getOperationName());
+                vo.setTechnologyOperationId(structure.getTechnologyOperationId());
+                vo.setProductName(structure.getProductName());
+                vo.setModel(structure.getModel());
+                vo.setDemandedQuantity(BigDecimal.ZERO);
+                vo.setUnit(structure.getUnit());
+                List<String> batchNoList = stockBatchNoMap.get(productModelId) == null
+                        ? Collections.emptyList()
+                        : new ArrayList<>(stockBatchNoMap.get(productModelId));
+                vo.setBatchNoList(batchNoList);
+                vo.setStockQuantity(stockQuantityMap.getOrDefault(productModelId, BigDecimal.ZERO));
+                vo.setBom(true);
+                mergedPickMap.put(mergeKey, vo);
+            }
+            vo.setDemandedQuantity(defaultDecimal(vo.getDemandedQuantity()).add(defaultDecimal(structure.getDemandedQuantity())));
         }
-        return pickList;
+        return new ArrayList<>(mergedPickMap.values());
     }
 
     @Override
     public int updateOrder(ProductionOrderDto productionOrderDto) {
         // 鏇存柊鐢熶骇璁㈠崟涓绘暟鎹�
-        productionOrderDto.setStatus(ProductOrderStatusEnum.END.getCode());
+        productionOrderDto.setStatus(5);
         return baseMapper.updateById(productionOrderDto);
     }
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionPlanServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionPlanServiceImpl.java
index 53b1ee9..b00266b 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionPlanServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionPlanServiceImpl.java
@@ -311,7 +311,7 @@
             BeanUtils.copyProperties(dto, entity);
             entity.setProductModelId(resolveProductModelId(dto, i + 2, allModels, productNameById));
             entity.setStatus(PLAN_STATUS_WAIT);
-            entity.setSource("鍐呴儴");
+            entity.setSource(StringUtils.isNotEmpty(dto.getSource()) ? StringUtils.trim(dto.getSource()) : "鍐呴儴");
             entity.setQuantityIssued(BigDecimal.ZERO);
             entity.setCreateTime(now);
             entity.setUpdateTime(now);
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
index 4a8366a..1866a74 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -27,6 +27,7 @@
 import com.ruoyi.quality.mapper.*;
 import com.ruoyi.quality.pojo.*;
 import com.ruoyi.stock.pojo.StockInRecord;
+import com.ruoyi.stock.pojo.StockInventory;
 import com.ruoyi.stock.service.StockInRecordService;
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.service.StockInventoryService;
@@ -42,15 +43,7 @@
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
@@ -360,6 +353,12 @@
                         StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(),
                         productModel.getId(),
                         "0");
+
+                //StockInRecord stockInRecord = stockInRecordService.getOne(Wrappers.<StockInRecord>lambdaQuery()
+                //        .eq(StockInRecord::getRecordId, productionProductMain.getId())
+                //        .eq(StockInRecord::getRecordType, StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode())
+                //);
+                //stockInRecordService.batchApprove(Collections.singletonList(stockInRecord.getId()),1);
             }
 
             productionOperationTask.setCompleteQuantity(defaultDecimal(productionOperationTask.getCompleteQuantity()).add(productQty));
@@ -378,10 +377,8 @@
             if (ObjectUtils.isNull(productionOrder.getStartTime())) {
                 productionOrder.setStartTime(LocalDateTime.now());
             }
-            // 浠呭緟寮�濮嬬姸鎬佹墠鎺ㄨ繘鍒拌繘琛屼腑锛岄伩鍏嶉潪鏈亾宸ュ簭鎶ュ伐鏃惰鐩栧凡瀹屾垚鐘舵�併��
-            if (ProductOrderStatusEnum.WAIT.getCode().equals(productionOrder.getStatus())) {
-                productionOrder.setStatus(ProductOrderStatusEnum.RUNNING.getCode());
-            }
+            // 璁㈠崟鐘舵�佺敱鏈�鍚庝竴閬撳伐搴忕殑鍚堟牸浜у嚭鎺ㄥ姩锛岄伩鍏嶄腑闂村伐搴忔彁鍓嶅畬宸ャ��
+            productionOrder.setStatus(ProductOrderStatusEnum.RUNNING.getCode());
             if (isLastOperation) {
                 productionOrder.setCompleteQuantity(defaultDecimal(productionOrder.getCompleteQuantity()).add(productQty));
                 if (productionOrder.getQuantity() != null
diff --git a/src/main/java/com/ruoyi/project/common/CommonController.java b/src/main/java/com/ruoyi/project/common/CommonController.java
index 093e132..4e8c1f2 100644
--- a/src/main/java/com/ruoyi/project/common/CommonController.java
+++ b/src/main/java/com/ruoyi/project/common/CommonController.java
@@ -3,6 +3,8 @@
 import com.ruoyi.basic.service.StorageBlobService;
 import com.ruoyi.basic.utils.FileUtil;
 import com.ruoyi.framework.aspectj.lang.annotation.Anonymous;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -36,6 +38,7 @@
     private final StorageBlobService storageBlobService;
     private final FileUtil fileUtil;
 
+    @Log(title = "閫氱敤鏂囦欢涓婁紶", businessType = BusinessType.INSERT)
     @PostMapping({"/upload"})
     @Operation(summary = "鏂囦欢涓婁紶")
     public R upload(@RequestParam("files") List<MultipartFile> files) {
@@ -46,6 +49,7 @@
      * 鍏叡鏂囦欢涓婁紶
      * 姝ゆ帴鍙d笂浼犵殑鏂囦欢姘镐箙鏈夋晥锛屾厧鐢�
      */
+    @Log(title = "鍏叡鏂囦欢涓婁紶", businessType = BusinessType.INSERT)
     @PostMapping({"/public/upload"})
     @Operation(summary = "鏂囦欢涓婁紶")
     public R publicUpload(@RequestParam("files") List<MultipartFile> files) {
diff --git a/src/main/java/com/ruoyi/project/system/domain/SysUser.java b/src/main/java/com/ruoyi/project/system/domain/SysUser.java
index 39050e5..515210e 100644
--- a/src/main/java/com/ruoyi/project/system/domain/SysUser.java
+++ b/src/main/java/com/ruoyi/project/system/domain/SysUser.java
@@ -1,8 +1,8 @@
 package com.ruoyi.project.system.domain;
 
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.ruoyi.common.xss.Xss;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.ruoyi.common.xss.Xss;
 import com.ruoyi.framework.aspectj.lang.annotation.Excel;
 import com.ruoyi.framework.aspectj.lang.annotation.Excel.ColumnType;
 import com.ruoyi.framework.aspectj.lang.annotation.Excel.Type;
@@ -60,13 +60,13 @@
     @Excel(name = "璐﹀彿鐘舵��", readConverterExp = "0=姝e父,1=鍋滅敤")
     private String status;
 
-    /** 鍒犻櫎鏍囧織锛�0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛� */
-    private String delFlag;
-
-    /** 鏄惁寮�閫欰I鍔熻兘锛�0鍚� 1鏄級 */
-    @JsonIgnore
-    private Integer aiEnabled;
-
+    /** 鍒犻櫎鏍囧織锛�0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛� */
+    private String delFlag;
+
+    /** 鏄惁寮�閫欰I鍔熻兘锛�0鍚� 1鏄級 */
+    @JsonIgnore
+    private Integer aiEnabled;
+
     /** 鏈�鍚庣櫥褰旾P */
     @Excel(name = "鏈�鍚庣櫥褰旾P", type = Type.EXPORT)
     private String loginIp;
@@ -128,12 +128,6 @@
      */
     @TableField(exist = false)
     private String deptNames;
-
-    /**
-     * 瑙掕壊鍚嶇О
-     */
-    @TableField(exist = false)
-    private String roleNames;
 
     public Long getCurrentDeptId() {
         return currentDeptId;
@@ -261,25 +255,25 @@
         this.status = status;
     }
 
-    public String getDelFlag()
-    {
-        return delFlag;
-    }
+    public String getDelFlag()
+    {
+        return delFlag;
+    }
 
-    public void setDelFlag(String delFlag)
-    {
-        this.delFlag = delFlag;
-    }
-
-    public Integer getAiEnabled()
-    {
-        return aiEnabled;
-    }
-
-    public void setAiEnabled(Integer aiEnabled)
-    {
-        this.aiEnabled = aiEnabled;
-    }
+    public void setDelFlag(String delFlag)
+    {
+        this.delFlag = delFlag;
+    }
+
+    public Integer getAiEnabled()
+    {
+        return aiEnabled;
+    }
+
+    public void setAiEnabled(Integer aiEnabled)
+    {
+        this.aiEnabled = aiEnabled;
+    }
 
     public String getLoginIp()
     {
@@ -375,14 +369,6 @@
         this.deptNames = deptNames;
     }
 
-    public String getRoleNames() {
-        return roleNames;
-    }
-
-    public void setRoleNames(String roleNames) {
-        this.roleNames = roleNames;
-    }
-
     public Long getDeptId() {
         return deptId;
     }
@@ -402,10 +388,10 @@
             .append("sex", getSex())
             .append("avatar", getAvatar())
             .append("password", getPassword())
-            .append("status", getStatus())
-            .append("delFlag", getDelFlag())
-            .append("aiEnabled", getAiEnabled())
-            .append("loginIp", getLoginIp())
+            .append("status", getStatus())
+            .append("delFlag", getDelFlag())
+            .append("aiEnabled", getAiEnabled())
+            .append("loginIp", getLoginIp())
             .append("loginDate", getLoginDate())
             .append("createBy", getCreateBy())
             .append("createTime", getCreateTime())
diff --git a/src/main/java/com/ruoyi/project/system/mapper/SysUserDeptMapper.java b/src/main/java/com/ruoyi/project/system/mapper/SysUserDeptMapper.java
index f5baaec..8c0ca53 100644
--- a/src/main/java/com/ruoyi/project/system/mapper/SysUserDeptMapper.java
+++ b/src/main/java/com/ruoyi/project/system/mapper/SysUserDeptMapper.java
@@ -3,7 +3,6 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.project.system.domain.SysUserDept;
 import com.ruoyi.project.system.domain.vo.SysUserDeptVo;
-import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -16,28 +15,4 @@
     List<SysUserDeptVo> userLoginFacotryList(@Param("userDeptVo") SysUserDeptVo userDeptVo);
 
     List<Map<String, Object>> setSchemeApplicableStaffUserInfo(@Param("ids") List<Long> ids);
-
-    @Select("<script>" +
-            "select count(distinct sud.user_id) " +
-            "from sys_user_dept sud " +
-            "inner join sys_user su on su.user_id = sud.user_id " +
-            "where su.del_flag = '0' " +
-            "and sud.dept_id in " +
-            "<foreach collection='deptIds' item='deptId' open='(' separator=',' close=')'>" +
-            "#{deptId}" +
-            "</foreach>" +
-            "</script>")
-    Long countDistinctUserIdsByDeptIds(@Param("deptIds") List<Long> deptIds);
-
-    @Select("<script>" +
-            "select distinct sud.user_id " +
-            "from sys_user_dept sud " +
-            "inner join sys_user su on su.user_id = sud.user_id " +
-            "where su.del_flag = '0' " +
-            "and sud.dept_id in " +
-            "<foreach collection='deptIds' item='deptId' open='(' separator=',' close=')'>" +
-            "#{deptId}" +
-            "</foreach>" +
-            "</script>")
-    List<Long> selectDistinctUserIdsByDeptIds(@Param("deptIds") List<Long> deptIds);
 }
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 ccabf71..5507b3f 100644
--- a/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java
+++ b/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java
@@ -155,10 +155,5 @@
 
     List<Long> getUserByRole(@Param("role") String role);
 
-    /**
-     * 鏌ヨ鎵�鏈夋椿璺冪敤鎴凤紙鍚儴闂ㄥ悕绉板拰瑙掕壊鍚嶇О锛�
-     */
-    List<SysUser> selectUserListWithDetail();
-
     List<Long> getUserByPerms(@Param("perms") List<String> perms);
 }
diff --git a/src/main/java/com/ruoyi/project/system/service/impl/SysNoticeServiceImpl.java b/src/main/java/com/ruoyi/project/system/service/impl/SysNoticeServiceImpl.java
index d04239f..dcbcded 100644
--- a/src/main/java/com/ruoyi/project/system/service/impl/SysNoticeServiceImpl.java
+++ b/src/main/java/com/ruoyi/project/system/service/impl/SysNoticeServiceImpl.java
@@ -4,8 +4,6 @@
 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.collaborativeApproval.mapper.EnterpriseNewsMapper;
-import com.ruoyi.collaborativeApproval.pojo.EnterpriseNews;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.project.system.domain.SysDept;
 import com.ruoyi.project.system.domain.SysNotice;
@@ -20,12 +18,8 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 import java.util.stream.Collectors;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 /**
  * 鍏憡 鏈嶅姟灞傚疄鐜�
@@ -36,14 +30,11 @@
 @RequiredArgsConstructor
 public class SysNoticeServiceImpl  extends ServiceImpl<SysNoticeMapper, SysNotice> implements ISysNoticeService {
 
-    private static final Pattern ENTERPRISE_NEWS_ID_PATTERN = Pattern.compile("[?&]id=(\\d+)");
-
     private final SysNoticeMapper noticeMapper;
     private final SysUserMapper userMapper;
     private final SysDeptMapper deptMapper;
     private final SysUserDeptMapper userDeptMapper;
     private final UnipushService unipushService;
-    private final EnterpriseNewsMapper enterpriseNewsMapper;
 
     /**
      * 鏌ヨ鍏憡淇℃伅
@@ -87,24 +78,9 @@
      * @return 缁撴灉
      */
     @Override
-    @Transactional(rollbackFor = Exception.class)
     public int updateNotice(SysNotice notice)
     {
-        if (notice == null || notice.getNoticeId() == null) {
-            return 0;
-        }
-        SysNotice dbNotice = noticeMapper.selectNoticeById(notice.getNoticeId());
-        if (dbNotice == null) {
-            return 0;
-        }
-        boolean needSyncNewsReadCount = isEnterpriseNewsNotice(dbNotice)
-                && notice.getStatus() != null
-                && !notice.getStatus().equals(dbNotice.getStatus());
-        int rows = noticeMapper.updateNotice(notice);
-        if (rows > 0 && needSyncNewsReadCount) {
-            syncEnterpriseNewsReadCount(dbNotice.getJumpPath());
-        }
-        return rows;
+        return noticeMapper.updateNotice(notice);
     }
 
     /**
@@ -141,17 +117,10 @@
     @Override
     public int readAll() {
         Long userId = SecurityUtils.getUserId();
-        List<SysNotice> unreadNotices = noticeMapper.selectList(Wrappers.<SysNotice>lambdaQuery()
-                .eq(SysNotice::getConsigneeId, userId)
-                .eq(SysNotice::getStatus, "0"));
-        int rows = noticeMapper.update(null, Wrappers.<SysNotice>lambdaUpdate()
+        return noticeMapper.update(null, Wrappers.<SysNotice>lambdaUpdate()
                 .eq(SysNotice::getConsigneeId, userId)
                 .eq(SysNotice::getStatus, "0")
                 .set(SysNotice::getStatus, "1"));
-        if (rows > 0) {
-            syncEnterpriseNewsReadCount(unreadNotices);
-        }
-        return rows;
     }
 
     @Override
@@ -251,63 +220,9 @@
             return false;
         }
         sysNotice.setStatus("1");
-        boolean updated = noticeMapper.update(null, Wrappers.<SysNotice>lambdaUpdate()
+        return noticeMapper.update(null, Wrappers.<SysNotice>lambdaUpdate()
                 .eq(SysNotice::getNoticeId, noticeId)
                 .eq(SysNotice::getStatus, "0")
                 .set(SysNotice::getStatus, "1")) > 0;
-        if (updated) {
-            syncEnterpriseNewsReadCount(sysNotice.getJumpPath());
-        }
-        return updated;
-    }
-
-    private boolean isEnterpriseNewsNotice(SysNotice sysNotice) {
-        return sysNotice != null
-                && sysNotice.getJumpPath() != null
-                && sysNotice.getJumpPath().contains("/enterpriseNews?id=");
-    }
-
-    private void syncEnterpriseNewsReadCount(List<SysNotice> notices) {
-        if (notices == null || notices.isEmpty()) {
-            return;
-        }
-        Set<String> jumpPaths = new HashSet<>();
-        for (SysNotice notice : notices) {
-            if (isEnterpriseNewsNotice(notice)) {
-                jumpPaths.add(notice.getJumpPath());
-            }
-        }
-        for (String jumpPath : jumpPaths) {
-            syncEnterpriseNewsReadCount(jumpPath);
-        }
-    }
-
-    private void syncEnterpriseNewsReadCount(String jumpPath) {
-        Long newsId = parseEnterpriseNewsId(jumpPath);
-        if (newsId == null) {
-            return;
-        }
-        long readCount = noticeMapper.selectCount(Wrappers.<SysNotice>lambdaQuery()
-                .eq(SysNotice::getStatus, "1")
-                .eq(SysNotice::getJumpPath, jumpPath));
-        EnterpriseNews enterpriseNews = new EnterpriseNews();
-        enterpriseNews.setId(newsId);
-        enterpriseNews.setReadCount((int) readCount);
-        enterpriseNewsMapper.updateById(enterpriseNews);
-    }
-
-    private Long parseEnterpriseNewsId(String jumpPath) {
-        if (jumpPath == null || !jumpPath.startsWith("/enterpriseNews")) {
-            return null;
-        }
-        Matcher matcher = ENTERPRISE_NEWS_ID_PATTERN.matcher(jumpPath);
-        if (!matcher.find()) {
-            return null;
-        }
-        try {
-            return Long.parseLong(matcher.group(1));
-        } catch (NumberFormatException e) {
-            return null;
-        }
     }
 }
diff --git a/src/main/java/com/ruoyi/project/tool/swagger/TestController.java b/src/main/java/com/ruoyi/project/tool/swagger/TestController.java
index 0859437..52e324d 100644
--- a/src/main/java/com/ruoyi/project/tool/swagger/TestController.java
+++ b/src/main/java/com/ruoyi/project/tool/swagger/TestController.java
@@ -12,14 +12,16 @@
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.R;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.Parameters;
-import io.swagger.v3.oas.annotations.media.Schema;
-import io.swagger.v3.oas.annotations.tags.Tag;
+import com.ruoyi.common.utils.StringUtils;
+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.R;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.tags.Tag;
 
 /**
  * swagger 鐢ㄦ埛娴嬭瘯鏂规硶
@@ -46,9 +48,9 @@
     }
 
     @Operation(summary = "鑾峰彇鐢ㄦ埛璇︾粏")
-    @Parameter(name = "userId", description = "鐢ㄦ埛ID", required = true)
-    @GetMapping("/{userId}")
-    public R<UserEntity> getUser(@PathVariable Integer userId)
+    @Parameter(name = "userId", description = "鐢ㄦ埛ID", required = true)
+    @GetMapping("/{userId}")
+    public R<UserEntity> getUser(@PathVariable Integer userId)
     {
         if (!users.isEmpty() && users.containsKey(userId))
         {
@@ -60,15 +62,16 @@
         }
     }
 
+    @Log(title = "娴嬭瘯鎺ュ彛鏂板鐢ㄦ埛", businessType = BusinessType.INSERT)
     @Operation(summary = "鏂板鐢ㄦ埛")
-    @Parameters({
-        @Parameter(name = "userId", description = "鐢ㄦ埛id"),
-        @Parameter(name = "username", description = "鐢ㄦ埛鍚嶇О"),
-        @Parameter(name = "password", description = "鐢ㄦ埛瀵嗙爜"),
-        @Parameter(name = "mobile", description = "鐢ㄦ埛鎵嬫満")
-    })
-    @PostMapping("/save")
-    public R<String> save(UserEntity user)
+    @Parameters({
+        @Parameter(name = "userId", description = "鐢ㄦ埛id"),
+        @Parameter(name = "username", description = "鐢ㄦ埛鍚嶇О"),
+        @Parameter(name = "password", description = "鐢ㄦ埛瀵嗙爜"),
+        @Parameter(name = "mobile", description = "鐢ㄦ埛鎵嬫満")
+    })
+    @PostMapping("/save")
+    public R<String> save(UserEntity user)
     {
         if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId()))
         {
@@ -78,6 +81,7 @@
         return R.ok();
     }
 
+    @Log(title = "娴嬭瘯鎺ュ彛鏇存柊鐢ㄦ埛", businessType = BusinessType.UPDATE)
     @Operation(summary = "鏇存柊鐢ㄦ埛")
     @PutMapping("/update")
     public R<String> update(@RequestBody UserEntity user)
@@ -95,10 +99,11 @@
         return R.ok();
     }
 
+    @Log(title = "娴嬭瘯鎺ュ彛鍒犻櫎鐢ㄦ埛", businessType = BusinessType.DELETE)
     @Operation(summary = "鍒犻櫎鐢ㄦ埛淇℃伅")
-    @Parameter(name = "userId", description = "鐢ㄦ埛ID", required = true)
-    @DeleteMapping("/{userId}")
-    public R<String> delete(@PathVariable Integer userId)
+    @Parameter(name = "userId", description = "鐢ㄦ埛ID", required = true)
+    @DeleteMapping("/{userId}")
+    public R<String> delete(@PathVariable Integer userId)
     {
         if (!users.isEmpty() && users.containsKey(userId))
         {
diff --git a/src/main/java/com/ruoyi/projectManagement/controller/InfoController.java b/src/main/java/com/ruoyi/projectManagement/controller/InfoController.java
index 56baf0f..ed44f79 100644
--- a/src/main/java/com/ruoyi/projectManagement/controller/InfoController.java
+++ b/src/main/java/com/ruoyi/projectManagement/controller/InfoController.java
@@ -1,5 +1,7 @@
 package com.ruoyi.projectManagement.controller;
 
+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.projectManagement.dto.InfoStageDto;
 import com.ruoyi.projectManagement.dto.UpdateStateInfo;
@@ -31,6 +33,7 @@
 
     @PostMapping("/save")
     @Operation(summary = "淇濆瓨")
+    @Log(title = "椤圭洰淇℃伅-淇濆瓨", businessType = BusinessType.INSERT)
     public AjaxResult save(@RequestBody @Valid SaveInfoVo saveInfoVo) {
         infoService.save(saveInfoVo);
         return AjaxResult.success();
@@ -38,6 +41,7 @@
 
     @PostMapping("/updateStatus")
     @Operation(summary = "淇敼鐘舵��")
+    @Log(title = "椤圭洰淇℃伅-淇敼鐘舵��", businessType = BusinessType.UPDATE)
     public AjaxResult updateStatus(@RequestBody @Valid UpdateStateInfo updateStateInfo){
         infoService.updateStatus(updateStateInfo);
         return AjaxResult.success();
@@ -45,6 +49,7 @@
 
     @PostMapping("/delete/{id}")
     @Operation(summary = "鍒犻櫎")
+    @Log(title = "椤圭洰淇℃伅-鍒犻櫎", businessType = BusinessType.DELETE)
     public AjaxResult delete(@PathVariable Long id) {
         infoService.deleteInfo(id);
         return AjaxResult.success();
@@ -65,6 +70,7 @@
 
     @PostMapping("/saveStage")
     @Operation(summary = "淇濆瓨闃舵")
+    @Log(title = "椤圭洰淇℃伅-淇濆瓨闃舵", businessType = BusinessType.INSERT)
     public AjaxResult saveStage(@RequestBody @Valid SaveInfoStageVo dto) {
         infoStageHandleService.save(dto);
         return AjaxResult.success();
@@ -78,6 +84,7 @@
 
     @PostMapping("/deleteStage/{id}")
     @Operation(summary = "鍒犻櫎闃舵")
+    @Log(title = "椤圭洰淇℃伅-鍒犻櫎闃舵", businessType = BusinessType.DELETE)
     public AjaxResult deleteStage(@PathVariable Long id) {
         infoStageHandleService.deleteById(id);
         return AjaxResult.success();
diff --git a/src/main/java/com/ruoyi/projectManagement/controller/PlanController.java b/src/main/java/com/ruoyi/projectManagement/controller/PlanController.java
index c8b982c..9857c27 100644
--- a/src/main/java/com/ruoyi/projectManagement/controller/PlanController.java
+++ b/src/main/java/com/ruoyi/projectManagement/controller/PlanController.java
@@ -1,5 +1,7 @@
 package com.ruoyi.projectManagement.controller;
 
+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.projectManagement.service.PlanService;
 import com.ruoyi.projectManagement.vo.SavePlanNodeVo;
@@ -28,6 +30,7 @@
 
     @PostMapping("/save")
     @Operation(summary = "淇濆瓨")
+    @Log(title = "椤圭洰璁″垝-淇濆瓨", businessType = BusinessType.INSERT)
     public AjaxResult save(@RequestBody @Valid SavePlanVo savePlanVo) {
         planService.savePlan(savePlanVo);
         return AjaxResult.success();
@@ -35,6 +38,7 @@
 
     @PostMapping("/delete/{id}")
     @Operation(summary = "鍒犻櫎")
+    @Log(title = "椤圭洰璁″垝-鍒犻櫎", businessType = BusinessType.DELETE)
     public AjaxResult delete(@PathVariable Long id) {
         planService.deletePlan(id);
         return AjaxResult.success();
diff --git a/src/main/java/com/ruoyi/projectManagement/controller/RolesController.java b/src/main/java/com/ruoyi/projectManagement/controller/RolesController.java
index 709c1aa..02217e5 100644
--- a/src/main/java/com/ruoyi/projectManagement/controller/RolesController.java
+++ b/src/main/java/com/ruoyi/projectManagement/controller/RolesController.java
@@ -4,9 +4,9 @@
 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.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
-
-import java.time.LocalDateTime;
 import com.ruoyi.projectManagement.dto.RoleDto;
 import com.ruoyi.projectManagement.mapper.RolesMapper;
 import com.ruoyi.projectManagement.pojo.Roles;
@@ -35,21 +35,24 @@
 
     @PostMapping("/add")
     @Operation(summary = "鏂板")
+    @Log(title = "椤圭洰瑙掕壊-鏂板", businessType = BusinessType.INSERT)
     public AjaxResult add(@RequestBody RoleDto roleDto) {
         if (roleDto.getIsDefaultNo()) {
-            roleDto.setNo(OrderUtils.countTodayByCreateTime(rolesMapper, "XMJS","no", roleDto.getCreateTime() != null ? roleDto.getCreateTime() : LocalDateTime.now()));
+            roleDto.setNo(OrderUtils.countTodayByCreateTime(rolesMapper, "XMJS","no"));
         }
         return AjaxResult.success(rolesservice.save(roleDto));
     }
 
     @PostMapping("/update")
     @Operation(summary = "淇敼")
+    @Log(title = "椤圭洰瑙掕壊-淇敼", businessType = BusinessType.UPDATE)
     public AjaxResult update(@RequestBody Roles roles) {
         return AjaxResult.success(rolesservice.updateById(roles));
     }
 
     @DeleteMapping("/delete")
     @Operation(summary = "鍒犻櫎")
+    @Log(title = "椤圭洰瑙掕壊-鍒犻櫎", businessType = BusinessType.DELETE)
     public AjaxResult delete(@RequestBody List<Long> ids) {
         if (CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
         return AjaxResult.success(rolesservice.removeBatchByIds(ids));
diff --git a/src/main/java/com/ruoyi/projectManagement/pojo/Roles.java b/src/main/java/com/ruoyi/projectManagement/pojo/Roles.java
index ed111b8..1b65ea4 100644
--- a/src/main/java/com/ruoyi/projectManagement/pojo/Roles.java
+++ b/src/main/java/com/ruoyi/projectManagement/pojo/Roles.java
@@ -38,6 +38,7 @@
     private Integer status;
 
     @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
     private LocalDateTime createTime;
 
     @Schema(description = "鍒涘缓鐢ㄦ埛")
diff --git a/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java b/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
index 3b20e8f..07a090d 100644
--- a/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
+++ b/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
@@ -7,7 +7,6 @@
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
 import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.framework.web.page.TableDataInfo;
 import com.ruoyi.purchase.dto.PurchaseLedgerDto;
 import com.ruoyi.purchase.mapper.PurchaseLedgerTemplateMapper;
@@ -32,8 +31,8 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.URLEncoder;
-import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 閲囪喘鍙拌处Controller
@@ -118,16 +117,6 @@
     }
 
     /**
-     * 鏌ヨ閲囪喘閫�璐у彲閫夐噰璐彴璐�
-     */
-    @GetMapping("/returnableList")
-    public TableDataInfo returnableList(PurchaseLedger purchaseLedger) {
-        startPage();
-        List<PurchaseLedger> list = purchaseLedgerService.selectReturnablePurchaseLedgerList(purchaseLedger);
-        return getDataTable(list);
-    }
-
-    /**
      * 瀵煎嚭閲囪喘鍙拌处鍒楄〃
      */
     @Log(title = "閲囪喘鍙拌处", businessType = BusinessType.EXPORT)
@@ -146,13 +135,6 @@
     @PostMapping("/addOrEditPurchase")
     public AjaxResult addOrEditPurchase(@RequestBody PurchaseLedgerDto purchaseLedgerDto) throws Exception {
         return toAjax(purchaseLedgerService.addOrEditPurchase(purchaseLedgerDto));
-    }
-
-    @Operation(summary = "鎵归噺鎺ㄨ繘閲囪喘鍙拌处鍒板叆搴�")
-    @Log(title = "鎵归噺鎺ㄨ繘閲囪喘鍙拌处鍒板叆搴�", businessType = BusinessType.OTHER)
-    @PostMapping("/batchInsertPurchaseSteps")
-    public R batchInsertPurchaseSteps(@RequestBody PurchaseLedgerDto purchaseLedgerDto) {
-        return purchaseLedgerService.batchInsertPurchaseSteps(purchaseLedgerDto == null ? null : purchaseLedgerDto.getIds());
     }
 
     /**
@@ -176,6 +158,7 @@
     /**
      * 淇敼閲囪喘鍙拌处瀹℃壒鐘舵��
      */
+    @Log(title = "閲囪喘鍙拌处", businessType = BusinessType.UPDATE)
     @PostMapping("/updateApprovalStatus")
     public AjaxResult addOrEditPurchase(@RequestBody PurchaseLedger purchaseLedger){
         return toAjax(purchaseLedgerService.updateById(purchaseLedger));
@@ -265,7 +248,17 @@
     @Operation(summary = "鐢熸垚閲囪喘搴忓垪鍙�")
     @GetMapping("/createPurchaseNo")
     @Log(title = "鐢熸垚閲囪喘搴忓垪鍙�", businessType = BusinessType.OTHER)
-    public AjaxResult createPurchaseNo(@RequestParam Date entryDate) {
-        return AjaxResult.success("鐢熸垚鎴愬姛",purchaseLedgerService.getPurchaseNo(entryDate));
+    public AjaxResult createPurchaseNo() {
+        return AjaxResult.success("鐢熸垚鎴愬姛",purchaseLedgerService.getPurchaseNo());
+    }
+
+    @Operation(summary = "鑾峰彇閲囪喘鍗曟墦鍗版暟鎹�")
+    @GetMapping("/printData/{id}")
+    public AjaxResult printData(@PathVariable Long id) {
+        Map<String, Object> data = purchaseLedgerService.getPrintData(id);
+        if (data == null) {
+            return AjaxResult.error("閲囪喘鍗曚笉瀛樺湪");
+        }
+        return AjaxResult.success(data);
     }
 }
diff --git a/src/main/java/com/ruoyi/purchase/controller/PurchaseReturnOrdersController.java b/src/main/java/com/ruoyi/purchase/controller/PurchaseReturnOrdersController.java
index 579d62d..b362909 100644
--- a/src/main/java/com/ruoyi/purchase/controller/PurchaseReturnOrdersController.java
+++ b/src/main/java/com/ruoyi/purchase/controller/PurchaseReturnOrdersController.java
@@ -13,10 +13,6 @@
 import com.ruoyi.purchase.dto.PurchaseReturnOrderDto;
 import com.ruoyi.purchase.mapper.PurchaseReturnOrdersMapper;
 import com.ruoyi.purchase.pojo.PurchaseReturnOrders;
-import com.ruoyi.stock.mapper.StockOutRecordMapper;
-import com.ruoyi.stock.pojo.StockOutRecord;
-
-import java.time.LocalDateTime;
 import com.ruoyi.purchase.service.PurchaseReturnOrdersService;
 import com.ruoyi.purchase.vo.PurchaseStockInProductVo;
 import io.swagger.v3.oas.annotations.Operation;
@@ -42,7 +38,6 @@
     private PurchaseReturnOrdersService purchaseReturnOrdersService;
     private PurchaseReturnOrdersMapper purchaseReturnOrdersMapper;
     private AccountStatementDetailsService accountStatementDetailsService;
-    private StockOutRecordMapper stockOutRecordMapper;
 
 
     @GetMapping("/listPage")
@@ -55,7 +50,7 @@
     @PostMapping("/add")
     public AjaxResult add(@RequestBody PurchaseReturnOrderDto purchaseReturnOrderDto) throws Exception {
         if (purchaseReturnOrderDto.getIsDefaultNo()) {
-            purchaseReturnOrderDto.setNo(OrderUtils.countTodayByCreateTime(purchaseReturnOrdersMapper, "CGTL", "no", purchaseReturnOrderDto.getCreateTime() != null ? purchaseReturnOrderDto.getCreateTime() : LocalDateTime.now()));
+            purchaseReturnOrderDto.setNo(OrderUtils.countTodayByCreateTime(purchaseReturnOrdersMapper, "CGTL", "no"));
         }
         return AjaxResult.success(purchaseReturnOrdersService.add(purchaseReturnOrderDto));
     }
@@ -66,6 +61,7 @@
         return AjaxResult.success(purchaseReturnOrdersService.getPurchaseReturnOrderDtoById(id));
     }
 
+    @Log(title = "閲囪喘閫�璐у崟", businessType = BusinessType.DELETE)
     @PostMapping("/deleteById/{id}")
     public AjaxResult deleteById(@PathVariable Long id) {
         //濡傛灉璇ラ噰璐��璐у凡缁忕敓鎴愬璐﹀崟鍒欐棤娉曞垹闄�
@@ -74,13 +70,6 @@
                 .eq(AccountStatementDetails::getReceiptNumber, purchaseReturnOrders.getNo()));
         if (CollectionUtils.isNotEmpty(accountStatementDetails)){
             throw new ServiceException("璇ラ噰璐��璐у崟宸茬粡鐢熸垚瀵硅处鍗曪紝鏃犳硶鍒犻櫎");
-        }
-        List<StockOutRecord> approvedStockOutRecords = stockOutRecordMapper.selectList(Wrappers.<StockOutRecord>lambdaQuery()
-                .eq(StockOutRecord::getRecordType, "9")
-                .eq(StockOutRecord::getApprovalStatus, 1)
-                .inSql(StockOutRecord::getRecordId, "select id from purchase_return_order_products where purchase_return_order_id = " + id));
-        if (CollectionUtils.isNotEmpty(approvedStockOutRecords)) {
-            throw new ServiceException("璇ラ噰璐��璐у崟瀵瑰簲鍑哄簱宸插鏍搁�氳繃锛屾棤娉曞垹闄�");
         }
         purchaseReturnOrdersService.deleteById(id);
         return AjaxResult.success();
diff --git a/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java b/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
index ee089a5..22faea3 100644
--- a/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
+++ b/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
@@ -33,11 +33,6 @@
     private Long id;
 
     /**
-     * 瀹℃壒瀹炰緥ID
-     */
-    private Long approvalInstanceId;
-
-    /**
      * 閲囪喘鍚堝悓鍙�
      */
     @Excel(name = "閲囪喘鍚堝悓鍙�")
@@ -93,7 +88,7 @@
     /**
      * 褰曞叆鏃ユ湡
      */
-    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     @Excel(name = "褰曞叆鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
     private Date entryDate;
 
@@ -138,9 +133,6 @@
 
     private List<SalesLedgerProduct> productData;
 
-    @Schema(description = "鎵归噺澶勭悊閲囪喘鍙拌处ID鍒楄〃")
-    private List<Long> ids;
-
     private List<String> tempFileIds;
 
     private List<CommonFile> SalesLedgerFiles;
@@ -179,12 +171,6 @@
      */
     @Excel(name = "鍚堝悓閲戦")
     private BigDecimal contractAmount = BigDecimal.ZERO;
-
-    /**
-     * 瀹為檯鍚堝悓閲戦锛堟墸鍑忛��璐у悗锛�
-     */
-    @Schema(description = "瀹為檯鍚堝悓閲戦")
-    private BigDecimal netContractAmount = BigDecimal.ZERO;
 
 
     @Schema(description = "鏂囦欢绫诲瀷  鍙� 4")
diff --git a/src/main/java/com/ruoyi/purchase/dto/PurchaseReturnOrderHasAllInfoDto.java b/src/main/java/com/ruoyi/purchase/dto/PurchaseReturnOrderHasAllInfoDto.java
index 67c98dd..68ef597 100644
--- a/src/main/java/com/ruoyi/purchase/dto/PurchaseReturnOrderHasAllInfoDto.java
+++ b/src/main/java/com/ruoyi/purchase/dto/PurchaseReturnOrderHasAllInfoDto.java
@@ -15,13 +15,6 @@
     // 閲囪喘鍚堝悓鍙�
     private String purchaseContractNumber;
 
-    private String shippingTypeText;
-
-    /**
-     * 瀵瑰簲鍑哄簱鏄惁宸插鏍搁�氳繃
-     */
-    private Boolean stockOutApproved;
-
     //閫�鏂欎汉濮撳悕
     private String returnUserName;
 
diff --git a/src/main/java/com/ruoyi/purchase/mapper/PurchaseLedgerMapper.java b/src/main/java/com/ruoyi/purchase/mapper/PurchaseLedgerMapper.java
index feba849..8d5ab54 100644
--- a/src/main/java/com/ruoyi/purchase/mapper/PurchaseLedgerMapper.java
+++ b/src/main/java/com/ruoyi/purchase/mapper/PurchaseLedgerMapper.java
@@ -23,8 +23,6 @@
 
     IPage<PurchaseLedgerDto> selectPurchaseLedgerListPage(IPage ipage, @Param("c") PurchaseLedgerDto purchaseLedger);
 
-    List<PurchaseLedger> selectReturnablePurchaseLedgerList(@Param("c") PurchaseLedger purchaseLedger);
-
     List<IncomeExpenseAnalysisDto> selectPurchaseStats(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("dateFormat") String dateFormat);
 
     BigDecimal selectTotalPurchaseAmount(@Param("startDate") String startDate, @Param("endDate") String endDate);
diff --git a/src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java b/src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java
index ec96643..b55242c 100644
--- a/src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java
+++ b/src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java
@@ -69,7 +69,7 @@
     /**
      * 褰曞叆鏃ユ湡
      */
-    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     @Excel(name = "褰曞叆鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
     private Date entryDate;
 
@@ -119,12 +119,6 @@
      * 鍚堝悓閲戦锛堜骇鍝佸惈绋庢�讳环锛�
      */
     private BigDecimal contractAmount;
-
-    /**
-     * 瀹為檯鍚堝悓閲戦锛堟墸鍑忛��璐у悗锛�
-     */
-    @Schema(description = "瀹為檯鍚堝悓閲戦")
-    private BigDecimal netContractAmount;
 //
 //    /**
 //     * 涓氬姟鍛�
@@ -163,4 +157,5 @@
 
     @TableField(fill = FieldFill.INSERT)
     private Long deptId;
+
 }
diff --git a/src/main/java/com/ruoyi/purchase/pojo/PurchaseReturnOrders.java b/src/main/java/com/ruoyi/purchase/pojo/PurchaseReturnOrders.java
index abe0b8a..a89317b 100644
--- a/src/main/java/com/ruoyi/purchase/pojo/PurchaseReturnOrders.java
+++ b/src/main/java/com/ruoyi/purchase/pojo/PurchaseReturnOrders.java
@@ -44,18 +44,6 @@
     @Schema(description = "渚涘簲鍟唅d")
     private Long supplierId;
 
-    @Schema(description = "鍙戣揣绫诲瀷 1璐ц溅 2蹇��")
-    private Integer shippingType;
-
-    @Schema(description = "鍙戣揣杞︾墝鍙�")
-    private String truckPlateNo;
-
-    @Schema(description = "蹇�掑叕鍙�")
-    private String expressCompany;
-
-    @Schema(description = "蹇�掑崟鍙�")
-    private String expressNo;
-
     @Schema(description = "椤圭洰id")
     private Long projectId;
 
@@ -94,6 +82,7 @@
     private BigDecimal totalAmount;
 
     @Schema(description = "褰曞叆鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime createTime;
diff --git a/src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java b/src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java
index 78e86a1..b9afc5c 100644
--- a/src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java
+++ b/src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java
@@ -4,14 +4,13 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.purchase.dto.PurchaseLedgerDto;
 import com.ruoyi.purchase.pojo.PurchaseLedger;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 閲囪喘鍙拌处Service鎺ュ彛
@@ -23,11 +22,7 @@
 
     List<PurchaseLedger> selectPurchaseLedgerList(PurchaseLedger purchaseLedger);
 
-    List<PurchaseLedger> selectReturnablePurchaseLedgerList(PurchaseLedger purchaseLedger);
-
     int addOrEditPurchase(PurchaseLedgerDto purchaseLedgerDto) throws Exception;
-
-    R batchInsertPurchaseSteps(List<Long> ids);
 
     void addQualityInspect(PurchaseLedger purchaseLedger, SalesLedgerProduct saleProduct);
 
@@ -45,9 +40,11 @@
 
     IPage<PurchaseLedgerDto> selectPurchaseLedgerListPage(IPage ipage, PurchaseLedgerDto purchaseLedger);
 
-    String getPurchaseNo(Date entryDate);
+    String getPurchaseNo();
 
     AjaxResult importData(MultipartFile file);
 
     PurchaseLedgerDto getPurchaseByCode(PurchaseLedgerDto purchaseLedgerDto);
+
+    Map<String, Object> getPrintData(Long id);
 }
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/ProcurementBusinessSummaryServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/ProcurementBusinessSummaryServiceImpl.java
index b8ec1d4..45f72a0 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/ProcurementBusinessSummaryServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/ProcurementBusinessSummaryServiceImpl.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.utils.AmountUtils;
 import com.ruoyi.purchase.dto.ProcurementBusinessSummaryDto;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
 import lombok.RequiredArgsConstructor;
@@ -20,6 +21,8 @@
     private final SalesLedgerProductMapper salesLedgerProductMapper;
 
     public IPage<ProcurementBusinessSummaryDto> listPage(Page page, ProcurementBusinessSummaryDto procurementBusinessSummaryDto) {
-        return salesLedgerProductMapper.procurementBusinessSummaryListPage(page, procurementBusinessSummaryDto);
+        IPage<ProcurementBusinessSummaryDto> result = salesLedgerProductMapper.procurementBusinessSummaryListPage(page, procurementBusinessSummaryDto);
+        AmountUtils.normalizeProcurementBusinessSummaryList(result.getRecords());
+        return result;
     }
 }
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 7c25815..96b0a54 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -6,13 +6,8 @@
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.alibaba.fastjson2.JSON;
-import com.ruoyi.approve.bean.dto.ApprovalInstanceDto;
-import com.ruoyi.approve.mapper.ApprovalTemplateMapper;
-import com.ruoyi.approve.pojo.ApprovalInstance;
-import com.ruoyi.approve.pojo.ApprovalTemplate;
+import com.ruoyi.approve.bean.vo.ApproveProcessVO;
 import com.ruoyi.approve.pojo.ApproveProcess;
-import com.ruoyi.approve.service.ApprovalInstanceService;
 import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl;
 import com.ruoyi.basic.enums.ApplicationTypeEnum;
 import com.ruoyi.basic.enums.RecordTypeEnum;
@@ -23,23 +18,20 @@
 import com.ruoyi.basic.pojo.ProductModel;
 import com.ruoyi.basic.pojo.SupplierManage;
 import com.ruoyi.basic.utils.FileUtil;
-import com.ruoyi.common.enums.ApprovalStatusEnum;
-import com.ruoyi.common.enums.ReviewStatusEnum;
-import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.TypeEnums;
+import com.ruoyi.common.enums.FileNameType;
 import com.ruoyi.common.exception.base.BaseException;
-import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.AmountUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.security.LoginUser;
 import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.other.mapper.TempFileMapper;
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
-import com.ruoyi.procurementrecord.utils.StockUtils;
+import com.ruoyi.project.system.domain.SysDept;
 import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.mapper.SysDeptMapper;
 import com.ruoyi.project.system.mapper.SysUserMapper;
 import com.ruoyi.purchase.dto.PurchaseLedgerDto;
 import com.ruoyi.purchase.dto.PurchaseLedgerImportDto;
@@ -55,15 +47,13 @@
 import com.ruoyi.quality.pojo.QualityInspectParam;
 import com.ruoyi.quality.pojo.QualityTestStandard;
 import com.ruoyi.quality.pojo.QualityTestStandardParam;
-import com.ruoyi.quality.service.IQualityInspectService;
 import com.ruoyi.sales.mapper.CommonFileMapper;
 import com.ruoyi.sales.mapper.SalesLedgerMapper;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
+import com.ruoyi.sales.pojo.CommonFile;
 import com.ruoyi.sales.pojo.SalesLedger;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
-import com.ruoyi.stock.pojo.StockInRecord;
-import com.ruoyi.stock.service.StockInRecordService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
@@ -74,7 +64,6 @@
 
 import java.io.InputStream;
 import java.math.BigDecimal;
-import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
@@ -100,6 +89,7 @@
     private final SysUserMapper userMapper;
     private final TempFileMapper tempFileMapper;
     private final CommonFileMapper commonFileMapper;
+    private final SysDeptMapper sysDeptMapper;
     private final SupplierManageMapper supplierManageMapper;
     private final ProductMapper productMapper;
     private final ProductModelMapper productModelMapper;
@@ -113,11 +103,6 @@
     private final ApproveProcessServiceImpl approveProcessService;
     private final ProcurementRecordMapper procurementRecordStorageMapper;
     private final FileUtil fileUtil;
-    private final ApprovalInstanceService approvalInstanceService;
-    private final IQualityInspectService qualityInspectService;
-    private final StockInRecordService stockInRecordService;
-    private final StockUtils stockUtils;
-    private final ApprovalTemplateMapper approvalTemplateMapper;
 
     @Override
     public List<PurchaseLedger> selectPurchaseLedgerList(PurchaseLedger purchaseLedger) {
@@ -131,15 +116,7 @@
         if (purchaseLedger.getApprovalStatus() != null) {
             queryWrapper.eq(PurchaseLedger::getApprovalStatus, purchaseLedger.getApprovalStatus());
         }
-        // 鍙煡璇㈠叆搴撳凡瀹℃壒閫氳繃鐨勯噰璐彴璐�
-        queryWrapper.inSql(PurchaseLedger::getId,
-                "SELECT DISTINCT record_id FROM stock_in_record WHERE approval_status = 1");
         return purchaseLedgerMapper.selectList(queryWrapper);
-    }
-
-    @Override
-    public List<PurchaseLedger> selectReturnablePurchaseLedgerList(PurchaseLedger purchaseLedger) {
-        return purchaseLedgerMapper.selectReturnablePurchaseLedgerList(purchaseLedger);
     }
 
     @Override
@@ -148,6 +125,7 @@
         PurchaseLedger purchaseLedger = new PurchaseLedger();
         // DTO杞珽ntity
         BeanUtils.copyProperties(purchaseLedgerDto, purchaseLedger);
+        AmountUtils.normalizeContractAmount(purchaseLedger);
         SalesLedger salesLedger = salesLedgerMapper.selectById(purchaseLedgerDto.getSalesLedgerId());
         //褰曞叆浜�
         SysUser sysUser = userMapper.selectUserById(purchaseLedgerDto.getRecorderId());
@@ -172,13 +150,21 @@
         purchaseLedger.setRecorderId(purchaseLedgerDto.getRecorderId());
 
         purchaseLedger.setApprovalStatus(1);
-        // 瀹為檯鍚堝悓閲戦濮嬬粓绛変簬鍚堝悓閲戦
-        purchaseLedger.setNetContractAmount(purchaseLedger.getContractAmount());
         // 3. 鏂板鎴栨洿鏂颁富琛�
-        if (purchaseLedger.getId() == null && !StringUtils.hasText(purchaseLedger.getPurchaseContractNumber())) {
-            purchaseLedger.setPurchaseContractNumber(generatePurchaseContractNo(purchaseLedger.getEntryDate()));
+        if (purchaseLedger.getId() == null) {
+            purchaseLedgerMapper.insert(purchaseLedger);
+        } else {
+            // 鍒犻櫎閲囪喘瀹℃牳锛岄噸鏂版彁浜�
+            ApproveProcess one = approveProcessService.getOne(new LambdaQueryWrapper<ApproveProcess>()
+                    .eq(ApproveProcess::getApproveType, 5)
+                    .eq(ApproveProcess::getApproveReason, purchaseLedger.getPurchaseContractNumber())
+                    .eq(ApproveProcess::getApproveDelete, 0)
+                    .last("limit 1"));
+            if (one != null) {
+                approveProcessService.delByIds(Collections.singletonList(one.getId()));
+            }
+            purchaseLedgerMapper.updateById(purchaseLedger);
         }
-        this.saveOrUpdate(purchaseLedger);
 
         // 4. 澶勭悊瀛愯〃鏁版嵁
         List<SalesLedgerProduct> productList = purchaseLedgerDto.getProductData();
@@ -186,202 +172,10 @@
             handleSalesLedgerProducts(purchaseLedger.getId(), productList, purchaseLedgerDto.getType());
         }
         // 6.閲囪喘瀹℃牳鏂板锛涘鎵圭鐞嗘湭閰嶇疆閲囪喘瀹℃壒浜烘椂锛屽鎵规湇鍔′細鑷姩缃负瀹℃壒閫氳繃銆�
-        //鏌ヨ褰撳墠閲囪喘鍚堝悓鍙锋槸鍚﹀凡娣诲姞瀹℃壒锛屽鏋滄湁涓斾笉鏄┏鍥炵姸鎬侊紝鍒欎笉閲嶅娣诲姞
-        ApprovalInstance oldApprovalInstance = approvalInstanceService.getOne(Wrappers.<ApprovalInstance>lambdaQuery()
-                .eq(ApprovalInstance::getDeleted, 0)
-                .eq(ApprovalInstance::getBusinessType, TypeEnums.PURCHASE_APPROVAL.getCode())
-                .eq(ApprovalInstance::getBusinessId, purchaseLedger.getId())
-                .ne(ApprovalInstance::getStatus,"REJECTED")
-                .last("limit 1")
-        );
-        if(Objects.isNull(oldApprovalInstance)){
-            addApproveByPurchase(loginUser, purchaseLedger, productList);
-        }
+        addApproveByPurchase(loginUser, purchaseLedger);
         // 5. 杩佺Щ涓存椂鏂囦欢鍒版寮忕洰褰�
         fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.PURCHASE_LEDGER, purchaseLedger.getId(), purchaseLedgerDto.getStorageBlobDTOS());
         return 1;
-    }
-
-    @Override
-    public R batchInsertPurchaseSteps(List<Long> ids) {
-        if (CollectionUtils.isEmpty(ids)) {
-            return R.fail("璇烽�夋嫨閲囪喘鍙拌处");
-        }
-
-        List<Long> distinctIds = ids.stream()
-                .filter(Objects::nonNull)
-                .distinct()
-                .collect(Collectors.toList());
-        if (CollectionUtils.isEmpty(distinctIds)) {
-            return R.fail("璇烽�夋嫨閲囪喘鍙拌处");
-        }
-
-        PurchaseLedgerDto queryDto = new PurchaseLedgerDto();
-        queryDto.setIds(distinctIds);
-        IPage<PurchaseLedgerDto> pageResult = this.selectPurchaseLedgerListPage(
-                new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(1, distinctIds.size()),
-                queryDto
-        );
-        List<PurchaseLedgerDto> ledgerDtos = pageResult == null || pageResult.getRecords() == null
-                ? Collections.emptyList()
-                : pageResult.getRecords();
-
-        Map<Long, PurchaseLedgerDto> ledgerDtoMap = ledgerDtos.stream()
-                .filter(item -> item.getId() != null)
-                .collect(Collectors.toMap(PurchaseLedgerDto::getId, item -> item, (left, right) -> left, LinkedHashMap::new));
-
-        List<Map<String, Object>> details = new ArrayList<>();
-        int successCount = 0;
-        int skipCount = 0;
-        int failCount = 0;
-        int autoApprovedCount = 0;
-
-        for (Long id : distinctIds) {
-            Map<String, Object> detail = new LinkedHashMap<>();
-            detail.put("purchaseLedgerId", id);
-            PurchaseLedgerDto purchaseLedgerDto = ledgerDtoMap.get(id);
-            if (purchaseLedgerDto == null) {
-                failCount++;
-                detail.put("status", "FAIL");
-                detail.put("message", "閲囪喘鍙拌处涓嶅瓨鍦ㄦ垨鏈煡璇㈠埌");
-                details.add(detail);
-                continue;
-            }
-
-            detail.put("purchaseContractNumber", purchaseLedgerDto.getPurchaseContractNumber());
-            detail.put("approvalStatus", purchaseLedgerDto.getApprovalStatus());
-            detail.put("stockInStatus", purchaseLedgerDto.getStockInStatus());
-
-            if (ApprovalStatusEnum.REJECTED.getCode().equals(purchaseLedgerDto.getApprovalStatus())) {
-                skipCount++;
-                detail.put("status", "SKIP");
-                detail.put("message", "閲囪喘鍗曞凡椹冲洖");
-                details.add(detail);
-                continue;
-            }
-
-            if ("瀹屽叏鍏ュ簱".equals(purchaseLedgerDto.getStockInStatus())) {
-                skipCount++;
-                detail.put("status", "SKIP");
-                detail.put("message", "閲囪喘鍗曞凡瀹屽叏鍏ュ簱");
-                details.add(detail);
-                continue;
-            }
-
-            try {
-                PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(id);
-                if (purchaseLedger == null) {
-                    failCount++;
-                    detail.put("status", "FAIL");
-                    detail.put("message", "閲囪喘鍙拌处涓嶅瓨鍦�");
-                    details.add(detail);
-                    continue;
-                }
-
-                if (!ApprovalStatusEnum.APPROVED.getCode().equals(purchaseLedger.getApprovalStatus())) {
-                    ApprovalInstance approvalInstance = approvalInstanceService.getOne(
-                            Wrappers.<ApprovalInstance>lambdaQuery()
-                                    .eq(ApprovalInstance::getBusinessId, purchaseLedger.getId())
-                                    .eq(ApprovalInstance::getBusinessType, 5L)
-                                    .eq(ApprovalInstance::getDeleted, 0)
-                                    .orderByDesc(ApprovalInstance::getId)
-                                    .last("limit 1")
-                    );
-                    if (approvalInstance == null) {
-                        failCount++;
-                        detail.put("status", "FAIL");
-                        detail.put("message", "鏈壘鍒板搴旂殑閲囪喘瀹℃壒瀹炰緥");
-                        details.add(detail);
-                        continue;
-                    }
-
-                    if ("APPROVED".equals(approvalInstance.getStatus())
-                            && !ApprovalStatusEnum.APPROVED.getCode().equals(purchaseLedger.getApprovalStatus())) {
-                        purchaseLedger.setApprovalStatus(ApprovalStatusEnum.APPROVED.getCode());
-                        purchaseLedgerMapper.updateById(purchaseLedger);
-                    } else if (!"APPROVED".equals(approvalInstance.getStatus())) {
-                        R autoApproveResult = approvalInstanceService.autoApprove(approvalInstance.getId());
-                        if (autoApproveResult == null || !R.isSuccess(autoApproveResult)) {
-                            failCount++;
-                            detail.put("status", "FAIL");
-                            detail.put("message", autoApproveResult == null ? "閲囪喘瀹℃壒鑷姩閫氳繃澶辫触" : autoApproveResult.getMsg());
-                            details.add(detail);
-                            continue;
-                        }
-                        autoApprovedCount++;
-                    }
-
-                    purchaseLedger = purchaseLedgerMapper.selectById(id);
-                    if (purchaseLedger == null || !ApprovalStatusEnum.APPROVED.getCode().equals(purchaseLedger.getApprovalStatus())) {
-                        failCount++;
-                        detail.put("status", "FAIL");
-                        detail.put("message", "閲囪喘鍗曞鎵圭姸鎬佹湭鏇存柊涓哄凡閫氳繃");
-                        details.add(detail);
-                        continue;
-                    }
-                }
-
-                List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(
-                        Wrappers.<SalesLedgerProduct>lambdaQuery()
-                                .eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedger.getId())
-                                .eq(SalesLedgerProduct::getType, 2)
-                                .orderByAsc(SalesLedgerProduct::getId)
-                );
-                if (CollectionUtils.isEmpty(products)) {
-                    skipCount++;
-                    detail.put("status", "SKIP");
-                    detail.put("message", "閲囪喘鍗曟病鏈変骇鍝佹槑缁�");
-                    details.add(detail);
-                    continue;
-                }
-
-                int processedProductCount = 0;
-                int skippedProductCount = 0;
-                int failedProductCount = 0;
-                for (SalesLedgerProduct product : products) {
-                    try {
-                        boolean processed;
-                        if (Boolean.TRUE.equals(product.getIsChecked())) {
-                            processed = processPurchaseQualityProduct(purchaseLedger, product);
-                        } else {
-                            processed = processPurchaseDirectProduct(purchaseLedger, product);
-                        }
-                        if (processed) {
-                            processedProductCount++;
-                        } else {
-                            skippedProductCount++;
-                        }
-                    } catch (Exception ex) {
-                        failedProductCount++;
-                        log.error("鎵归噺鎺ㄨ繘閲囪喘鍙拌处澶辫触, purchaseLedgerId={}, productId={}, productModelId={}",
-                                purchaseLedger.getId(), product.getId(), product.getProductModelId(), ex);
-                    }
-                }
-
-                successCount++;
-                detail.put("status", failedProductCount > 0 ? "PARTIAL" : "SUCCESS");
-                detail.put("processedProductCount", processedProductCount);
-                detail.put("skippedProductCount", skippedProductCount);
-                detail.put("failedProductCount", failedProductCount);
-                detail.put("message", failedProductCount > 0 ? "閮ㄥ垎浜у搧澶勭悊澶辫触" : "澶勭悊瀹屾垚");
-                details.add(detail);
-            } catch (Exception ex) {
-                failCount++;
-                detail.put("status", "FAIL");
-                detail.put("message", ex.getMessage());
-                details.add(detail);
-                log.error("鎵归噺鎺ㄨ繘閲囪喘鍙拌处澶辫触, purchaseLedgerId={}", id, ex);
-            }
-        }
-
-        Map<String, Object> summary = new LinkedHashMap<>();
-        summary.put("totalCount", distinctIds.size());
-        summary.put("successCount", successCount);
-        summary.put("skipCount", skipCount);
-        summary.put("failCount", failCount);
-        summary.put("autoApprovedCount", autoApprovedCount);
-        summary.put("details", details);
-        return R.ok(summary, "鎵归噺鎺ㄨ繘閲囪喘姝ラ瀹屾垚");
     }
 
 
@@ -409,219 +203,7 @@
                         param.setId(null);
                         param.setInspectId(qualityInspect.getId());
                         qualityInspectParamMapper.insert(param);
-            });
-        }
-    }
-
-    private boolean processPurchaseQualityProduct(PurchaseLedger purchaseLedger, SalesLedgerProduct product) {
-        if (purchaseLedger == null || product == null || product.getProductModelId() == null) {
-            return false;
-        }
-
-        QualityInspect qualityInspect = findLatestPurchaseQualityInspect(purchaseLedger.getId(), product.getProductModelId());
-        if (qualityInspect == null) {
-            addQualityInspect(purchaseLedger, product);
-            qualityInspect = findLatestPurchaseQualityInspect(purchaseLedger.getId(), product.getProductModelId());
-        }
-        if (qualityInspect == null) {
-            return false;
-        }
-
-        LocalDateTime purchaseInspectTime = toStartOfDayPlusDays(purchaseLedger.getEntryDate(), 1);
-        if (purchaseInspectTime != null && (qualityInspect.getCheckTime() == null
-                || !DateUtils.toLocalDate(qualityInspect.getCheckTime()).equals(purchaseInspectTime.toLocalDate()))) {
-            qualityInspect.setCheckTime(DateUtils.toDate(purchaseInspectTime.toLocalDate()));
-            qualityInspectMapper.updateById(qualityInspect);
-        }
-
-        List<StockInRecord> stockRecords = findQualityStockRecords(qualityInspect.getId(), product.getProductModelId());
-        if (hasApprovedStockRecord(stockRecords)) {
-            return true;
-        }
-
-        if (!Integer.valueOf(1).equals(qualityInspect.getInspectState())) {
-            R autoSubmitResult = qualityInspectService.autoSubmit(qualityInspect.getId());
-            if (autoSubmitResult == null || !R.isSuccess(autoSubmitResult)) {
-                return false;
-            }
-            qualityInspect = qualityInspectMapper.selectById(qualityInspect.getId());
-        }
-
-        stockRecords = findQualityStockRecords(qualityInspect.getId(), product.getProductModelId());
-        if (CollectionUtils.isEmpty(stockRecords)
-                && qualityInspect.getQualifiedQuantity() != null
-                && qualityInspect.getQualifiedQuantity().compareTo(BigDecimal.ZERO) > 0) {
-            stockUtils.addStockWithBatchNo(
-                    product.getProductModelId(),
-                    qualityInspect.getQualifiedQuantity(),
-                    StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode(),
-                    qualityInspect.getId(),
-                    null,
-                    purchaseInspectTime == null ? null : purchaseInspectTime.plusDays(1)
-            );
-            stockRecords = findQualityStockRecords(qualityInspect.getId(), product.getProductModelId());
-        }
-
-        StockInRecord targetStockRecord = findLatestUnapprovedStockRecord(stockRecords);
-        if (targetStockRecord == null) {
-            return false;
-        }
-
-        LocalDateTime qualityStockCreateTime = resolveQualityStockCreateTime(qualityInspect);
-        if (qualityStockCreateTime != null && (targetStockRecord.getCreateTime() == null
-                || !qualityStockCreateTime.equals(targetStockRecord.getCreateTime()))) {
-            targetStockRecord.setCreateTime(qualityStockCreateTime);
-            stockInRecordService.updateById(targetStockRecord);
-        }
-
-        approveStockRecords(Collections.singletonList(targetStockRecord));
-        stockRecords = findQualityStockRecords(qualityInspect.getId(), product.getProductModelId());
-        return hasApprovedStockRecord(stockRecords);
-    }
-
-    private boolean processPurchaseDirectProduct(PurchaseLedger purchaseLedger, SalesLedgerProduct product) {
-        if (purchaseLedger == null || product == null || product.getProductModelId() == null) {
-            return false;
-        }
-        if (product.getQuantity() == null) {
-            return false;
-        }
-        if (!StringUtils.hasText(purchaseLedger.getPurchaseContractNumber())) {
-            return false;
-        }
-
-        LocalDateTime stockCreateTime = toStartOfDayPlusDays(purchaseLedger.getEntryDate(), 1);
-
-        List<StockInRecord> stockRecords = findDirectStockRecords(purchaseLedger.getId(), purchaseLedger.getPurchaseContractNumber(), product.getProductModelId(), product.getId());
-        if (hasApprovedStockRecord(stockRecords)) {
-            return true;
-        }
-
-        if (CollectionUtils.isEmpty(stockRecords)) {
-            stockUtils.addStockWithBatchNo(
-                    product.getProductModelId(),
-                    product.getQuantity(),
-                    StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(),
-                    purchaseLedger.getId(),
-                    purchaseLedger.getPurchaseContractNumber() + "-" + product.getId(),
-                    stockCreateTime
-            );
-            stockRecords = findDirectStockRecords(purchaseLedger.getId(), purchaseLedger.getPurchaseContractNumber(), product.getProductModelId(), product.getId());
-        }
-
-        if (CollectionUtils.isEmpty(stockRecords)) {
-            return false;
-        }
-
-        StockInRecord targetStockRecord = findLatestUnapprovedStockRecord(stockRecords);
-        if (targetStockRecord == null) {
-            return false;
-        }
-
-        if (stockCreateTime != null && (targetStockRecord.getCreateTime() == null
-                || !stockCreateTime.equals(targetStockRecord.getCreateTime()))) {
-            targetStockRecord.setCreateTime(stockCreateTime);
-            stockInRecordService.updateById(targetStockRecord);
-        }
-
-        approveStockRecords(Collections.singletonList(targetStockRecord));
-        stockRecords = findDirectStockRecords(purchaseLedger.getId(), purchaseLedger.getPurchaseContractNumber(), product.getProductModelId(), product.getId());
-        return hasApprovedStockRecord(stockRecords);
-    }
-
-    private LocalDateTime toStartOfDayPlusDays(Date date, int days) {
-        if (date == null) {
-            return null;
-        }
-        return DateUtils.toLocalDate(date).plusDays(days).atStartOfDay();
-    }
-
-    private LocalDateTime resolveQualityStockCreateTime(QualityInspect qualityInspect) {
-        if (qualityInspect == null || qualityInspect.getCheckTime() == null) {
-            return null;
-        }
-        return DateUtils.toLocalDate(qualityInspect.getCheckTime()).plusDays(1).atStartOfDay();
-    }
-
-    private QualityInspect findLatestPurchaseQualityInspect(Long purchaseLedgerId, Long productModelId) {
-        if (purchaseLedgerId == null || productModelId == null) {
-            return null;
-        }
-        return qualityInspectMapper.selectOne(
-                Wrappers.<QualityInspect>lambdaQuery()
-                        .eq(QualityInspect::getInspectType, 0)
-                        .eq(QualityInspect::getPurchaseLedgerId, purchaseLedgerId)
-                        .eq(QualityInspect::getProductModelId, productModelId)
-                        .orderByDesc(QualityInspect::getId)
-                        .last("limit 1")
-        );
-    }
-
-    private List<StockInRecord> findQualityStockRecords(Long qualityInspectId, Long productModelId) {
-        if (qualityInspectId == null || productModelId == null) {
-            return Collections.emptyList();
-        }
-        return stockInRecordService.list(
-                Wrappers.<StockInRecord>lambdaQuery()
-                        .eq(StockInRecord::getRecordType, StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode())
-                        .eq(StockInRecord::getRecordId, qualityInspectId)
-                        .eq(StockInRecord::getProductModelId, productModelId)
-                        .orderByDesc(StockInRecord::getId)
-        );
-    }
-
-    private List<StockInRecord> findDirectStockRecords(Long purchaseLedgerId, String purchaseContractNumber, Long productModelId, Long purchaseProductId) {
-        if (purchaseLedgerId == null || productModelId == null || purchaseProductId == null || !StringUtils.hasText(purchaseContractNumber)) {
-            return Collections.emptyList();
-        }
-        String batchNo = purchaseContractNumber + "-" + purchaseProductId;
-        return stockInRecordService.list(
-                Wrappers.<StockInRecord>lambdaQuery()
-                        .eq(StockInRecord::getRecordType, StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode())
-                        .eq(StockInRecord::getRecordId, purchaseLedgerId)
-                        .eq(StockInRecord::getProductModelId, productModelId)
-                        .eq(StockInRecord::getBatchNo, batchNo)
-                        .orderByDesc(StockInRecord::getId)
-        );
-    }
-
-    private boolean hasApprovedStockRecord(List<StockInRecord> stockRecords) {
-        return stockRecords != null && stockRecords.stream()
-                .anyMatch(item -> ReviewStatusEnum.APPROVED.getCode().equals(item.getApprovalStatus()));
-    }
-
-    private StockInRecord findLatestUnapprovedStockRecord(List<StockInRecord> stockRecords) {
-        if (CollectionUtils.isEmpty(stockRecords)) {
-            return null;
-        }
-        return stockRecords.stream()
-                .filter(item -> !ReviewStatusEnum.APPROVED.getCode().equals(item.getApprovalStatus()))
-                .findFirst()
-                .orElse(null);
-    }
-
-    private void approveStockRecords(List<StockInRecord> stockRecords) {
-        if (CollectionUtils.isEmpty(stockRecords)) {
-            return;
-        }
-        List<Long> rejectedIds = stockRecords.stream()
-                .filter(item -> ReviewStatusEnum.REJECTED.getCode().equals(item.getApprovalStatus()))
-                .map(StockInRecord::getId)
-                .filter(Objects::nonNull)
-                .collect(Collectors.toList());
-        if (!rejectedIds.isEmpty()) {
-            stockInRecordService.batchReAudit(rejectedIds);
-        }
-
-        List<Long> pendingIds = stockRecords.stream()
-                .filter(item -> item.getApprovalStatus() == null
-                        || ReviewStatusEnum.PENDING_REVIEW.getCode().equals(item.getApprovalStatus())
-                        || ReviewStatusEnum.REJECTED.getCode().equals(item.getApprovalStatus()))
-                .map(StockInRecord::getId)
-                .filter(Objects::nonNull)
-                .collect(Collectors.toList());
-        if (!pendingIds.isEmpty()) {
-            stockInRecordService.batchApprove(pendingIds, ReviewStatusEnum.APPROVED.getCode());
+                    });
         }
     }
 
@@ -657,6 +239,7 @@
 
         // 璁剧疆瀛楁
         for (SalesLedgerProduct product : products) {
+            AmountUtils.normalizeSalesLedgerProduct(product);
             product.setSalesLedgerId(salesLedgerId);
 
             Long productId = product.getProductId();
@@ -698,10 +281,10 @@
         }
 
         // 璁$畻鎬诲惈绋庨噾棰�
-        BigDecimal totalTaxInclusiveAmount = products.stream()
+        BigDecimal totalTaxInclusiveAmount = AmountUtils.scaleAmount(products.stream()
                 .map(SalesLedgerProduct::getTaxInclusiveTotalPrice)
                 .filter(Objects::nonNull)
-                .reduce(BigDecimal.ZERO, BigDecimal::add);
+                .reduce(BigDecimal.ZERO, BigDecimal::add));
 
         // 鏇存柊涓昏〃鐨勬�婚噾棰濆瓧娈�
         if (salesLedgerId != null) {
@@ -763,30 +346,13 @@
         for (Long id : ids) {
             PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(id);
             if(purchaseLedger != null){
-                List<ApprovalInstance> approvalInstances = approvalInstanceService.list(new LambdaQueryWrapper<ApprovalInstance>()
-                        .eq(ApprovalInstance::getBusinessId, purchaseLedger.getId())
-                        .eq(ApprovalInstance::getBusinessType, 5L)
-                        .eq(ApprovalInstance::getDeleted, 0));
-                if (CollectionUtils.isNotEmpty(approvalInstances)) {
-                    approvalInstanceService.delete(
-                            approvalInstances.stream()
-                                    .map(ApprovalInstance::getId)
-                                    .filter(Objects::nonNull)
-                                    .collect(Collectors.toList())
-                    );
-                }
-
-                List<ApproveProcess> approveProcesses = approveProcessService.list(new LambdaQueryWrapper<ApproveProcess>()
+                ApproveProcess one = approveProcessService.getOne(new LambdaQueryWrapper<ApproveProcess>()
                         .eq(ApproveProcess::getApproveType, 5)
                         .eq(ApproveProcess::getApproveDelete, 0)
-                        .eq(ApproveProcess::getApproveReason, purchaseLedger.getPurchaseContractNumber()));
-                if (CollectionUtils.isNotEmpty(approveProcesses)) {
-                    approveProcessService.delByIds(
-                            approveProcesses.stream()
-                                    .map(ApproveProcess::getId)
-                                    .filter(Objects::nonNull)
-                                    .collect(Collectors.toList())
-                    );
+                        .eq(ApproveProcess::getApproveReason, purchaseLedger.getPurchaseContractNumber())
+                        .last("limit 1"));
+                if (one != null) {
+                    approveProcessService.delByIds(Collections.singletonList(one.getId()));
                 }
             }
         }
@@ -816,7 +382,9 @@
         // 4. 杞崲 DTO
         PurchaseLedgerDto resultDto = new PurchaseLedgerDto();
         BeanUtils.copyProperties(purchaseLedger, resultDto);
+        AmountUtils.normalizeContractAmount(resultDto);
         if (!products.isEmpty()) {
+            AmountUtils.normalizeSalesLedgerProducts(products);
             resultDto.setHasChildren(true);
             resultDto.setProductData(products);
             resultDto.setStorageBlobVOS(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.FILE, RecordTypeEnum.PURCHASE_LEDGER, purchaseLedger.getId()));
@@ -859,6 +427,7 @@
         queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedger.getId())
                 .eq(SalesLedgerProduct::getType, 2);
         List<SalesLedgerProduct> productList = salesLedgerProductMapper.selectList(queryWrapper);
+        AmountUtils.normalizeSalesLedgerProducts(productList);
         resultDto.setProductData(productList);
         return resultDto;
     }
@@ -890,17 +459,23 @@
 
     @Override
     public IPage<PurchaseLedgerDto> selectPurchaseLedgerListPage(IPage ipage, PurchaseLedgerDto purchaseLedger) {
-        return purchaseLedgerMapper.selectPurchaseLedgerListPage(ipage, purchaseLedger);
+        IPage<PurchaseLedgerDto> page = purchaseLedgerMapper.selectPurchaseLedgerListPage(ipage, purchaseLedger);
+        if (!CollectionUtils.isEmpty(page.getRecords())) {
+            page.getRecords().forEach(record -> {
+                AmountUtils.normalizeContractAmount(record);
+                AmountUtils.normalizeSalesLedgerProducts(record.getProductData());
+            });
+        }
+        return page;
     }
 
     @Override
-    public String getPurchaseNo(Date entryDate) {
-        LocalDate localDate = entryDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+    public String getPurchaseNo() {
         // 鐢熸垚鏃ユ湡鍓嶇紑锛堜緥濡傦細CG20250405锛�
-        String purchaseNo = "CG" + localDate.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+        String purchaseNo = "CG" + LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
 
         // 鏋勫缓 Redis Key锛堟寜澶╁垎闅旓級
-        String redisKey = "purchase_no:" + localDate.format(DateTimeFormatter.ISO_LOCAL_DATE);
+        String redisKey = "purchase_no:" + LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE);
 
         // 鑾峰彇褰撳墠搴忓彿骞堕�掑锛堝師瀛愭搷浣滐級
         Long sequence = redisTemplate.opsForValue().increment(redisKey);
@@ -967,7 +542,6 @@
                 salesLedger.setContractAmount(salesLedgerProductImportDtos.stream()
                         .map(PurchaseLedgerProductImportDto::getTaxInclusiveTotalPrice)
                         .reduce(BigDecimal.ZERO,BigDecimal::add));
-                salesLedger.setNetContractAmount(salesLedger.getContractAmount());
                 // 閫氳繃閿�鍞崟鍙风粦瀹氶攢鍞�
                 SalesLedger salesLedger1 = salesLedgerMapper.selectOne(new LambdaQueryWrapper<SalesLedger>()
                         .eq(SalesLedger::getSalesContractNo, salesLedger.getSalesContractNo())
@@ -997,8 +571,14 @@
                     BeanUtils.copyProperties(salesLedgerProductImportDto, salesLedgerProduct);
                     salesLedgerProduct.setSalesLedgerId(salesLedger.getId());
                     salesLedgerProduct.setType(2);
+                    AmountUtils.normalizeSalesLedgerProduct(salesLedgerProduct);
                     // 璁$畻涓嶅惈绋庢�讳环
-                    salesLedgerProduct.setTaxExclusiveTotalPrice(salesLedgerProduct.getTaxInclusiveTotalPrice().divide(new BigDecimal(1).add(salesLedgerProduct.getTaxRate().divide(new BigDecimal(100))), 2, RoundingMode.HALF_UP));
+                    salesLedgerProduct.setTaxExclusiveTotalPrice(
+                            AmountUtils.calcTaxExclusiveTotalPrice(
+                                    salesLedgerProduct.getTaxInclusiveTotalPrice(),
+                                    salesLedgerProduct.getTaxRate()
+                            )
+                    );
                     list.stream()
                             .filter(map -> map.get("productName").equals(salesLedgerProduct.getProductCategory()) && map.get("model").equals(salesLedgerProduct.getSpecificationModel()))
                             .findFirst()
@@ -1017,12 +597,7 @@
                     salesLedgerProductMapper.insert(salesLedgerProduct);
                 }
                 // 閲囪喘瀹℃牳
-                List<SalesLedgerProduct> snapshotProducts = salesLedgerProductMapper.selectList(
-                        new LambdaQueryWrapper<SalesLedgerProduct>()
-                                .eq(SalesLedgerProduct::getSalesLedgerId, salesLedger.getId())
-                                .eq(SalesLedgerProduct::getType, 2)
-                );
-                addApproveByPurchase(loginUser, salesLedger, snapshotProducts);
+                addApproveByPurchase(loginUser,salesLedger);
             }
 
             return AjaxResult.success("瀵煎叆鎴愬姛");
@@ -1034,131 +609,45 @@
 
     @Override
     public PurchaseLedgerDto getPurchaseByCode(PurchaseLedgerDto purchaseLedgerDto) {
-        PurchaseLedger purchaseLedger = null;
-        ApprovalInstance approvalSnapshotInstance = null;
-
-        // 1. 浼樺厛鎸夊綋鍓嶅鎵瑰疄渚嬫煡璇㈠揩鐓�
-        if (purchaseLedgerDto.getApprovalInstanceId() != null) {
-            approvalSnapshotInstance = approvalInstanceService.getById(purchaseLedgerDto.getApprovalInstanceId());
-            if (approvalSnapshotInstance != null && approvalSnapshotInstance.getBusinessId() != null) {
-                purchaseLedger = purchaseLedgerMapper.selectById(approvalSnapshotInstance.getBusinessId());
-            }
-        }
-
-        // 2. 娌′紶瀹℃壒瀹炰緥ID鏃讹紝閫�鍥炲埌鎸夐噰璐悎鍚屽彿鏌ヨ
+        // 1. 鏌ヨ涓昏〃
+        PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectOne(new LambdaQueryWrapper<PurchaseLedger>()
+                .eq(PurchaseLedger::getPurchaseContractNumber, purchaseLedgerDto.getPurchaseContractNumber())
+                .last("LIMIT 1"));
         if (purchaseLedger == null) {
-            purchaseLedger = purchaseLedgerMapper.selectOne(new LambdaQueryWrapper<PurchaseLedger>()
-                    .eq(PurchaseLedger::getPurchaseContractNumber, purchaseLedgerDto.getPurchaseContractNumber())
-                    .last("LIMIT 1"));
-            if (purchaseLedger == null) {
-                throw new BaseException("閲囪喘鍙拌处涓嶅瓨鍦�");
-            }
+            throw new BaseException("閲囪喘鍙拌处涓嶅瓨鍦�");
         }
 
-        // 3. 鏌ヨ褰撳墠閲囪喘鍗曞搴旂殑瀹℃壒蹇収
-        if (approvalSnapshotInstance == null) {
-            approvalSnapshotInstance = approvalInstanceService.getOne(new LambdaQueryWrapper<ApprovalInstance>()
-                    .eq(ApprovalInstance::getBusinessId, purchaseLedger.getId())
-                    .eq(ApprovalInstance::getBusinessType, 5L)
-                    .eq(ApprovalInstance::getDeleted, 0)
-                    .orderByDesc(ApprovalInstance::getId)
-                    .last("LIMIT 1"));
-        }
-
-        if (approvalSnapshotInstance != null && StringUtils.hasText(approvalSnapshotInstance.getFormConfig())) {
-            try {
-                PurchaseLedgerDto snapshot = JSON.parseObject(approvalSnapshotInstance.getFormConfig(), PurchaseLedgerDto.class);
-                if (snapshot != null) {
-                    snapshot.setId(purchaseLedger.getId());
-                    if (snapshot.getPurchaseContractNumber() == null) {
-                        snapshot.setPurchaseContractNumber(purchaseLedger.getPurchaseContractNumber());
-                    }
-                    if (snapshot.getSupplierId() == null) {
-                        snapshot.setSupplierId(purchaseLedger.getSupplierId());
-                    }
-                    if (snapshot.getSupplierName() == null) {
-                        snapshot.setSupplierName(purchaseLedger.getSupplierName());
-                    }
-                    if (snapshot.getSalesContractNo() == null) {
-                        snapshot.setSalesContractNo(purchaseLedger.getSalesContractNo());
-                    }
-                    if (snapshot.getSalesContractNoId() == null) {
-                        snapshot.setSalesContractNoId(purchaseLedger.getSalesLedgerId());
-                    }
-                    if (snapshot.getProjectName() == null) {
-                        snapshot.setProjectName(purchaseLedger.getProjectName());
-                    }
-                    if (snapshot.getEntryDate() == null) {
-                        snapshot.setEntryDate(purchaseLedger.getEntryDate());
-                    }
-                    if (snapshot.getExecutionDate() == null) {
-                        snapshot.setExecutionDate(purchaseLedger.getExecutionDate());
-                    }
-                    if (snapshot.getRemarks() == null) {
-                        snapshot.setRemarks(purchaseLedger.getRemarks());
-                    }
-                    if (snapshot.getRecorderId() == null) {
-                        snapshot.setRecorderId(purchaseLedger.getRecorderId());
-                    }
-                    if (snapshot.getRecorderName() == null) {
-                        snapshot.setRecorderName(purchaseLedger.getRecorderName());
-                    }
-                    snapshot.setProductData(snapshot.getProductData() == null ? Collections.emptyList() : snapshot.getProductData());
-                    snapshot.setHasChildren(CollectionUtils.isNotEmpty(snapshot.getProductData()));
-                    return snapshot;
-                }
-            } catch (Exception e) {
-                log.warn("瑙f瀽閲囪喘瀹℃壒蹇収澶辫触: {}", e.getMessage());
-            }
-        }
-
-        // 4. 鏌ヨ瀛愯〃
+        // 2. 鏌ヨ瀛愯〃
         LambdaQueryWrapper<SalesLedgerProduct> productWrapper = new LambdaQueryWrapper<>();
         productWrapper.eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedger.getId())
                 .eq(SalesLedgerProduct::getType, 2);
         List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(productWrapper);
 
-        // 5. 杞崲 DTO
+        // 4. 杞崲 DTO
         PurchaseLedgerDto resultDto = new PurchaseLedgerDto();
         BeanUtils.copyProperties(purchaseLedger, resultDto);
+        AmountUtils.normalizeContractAmount(resultDto);
         if (!products.isEmpty()) {
+            AmountUtils.normalizeSalesLedgerProducts(products);
             resultDto.setHasChildren(true);
             resultDto.setProductData(products);
         }
         return resultDto;
     }
 
-    public void addApproveByPurchase(LoginUser loginUser, PurchaseLedger purchaseLedger, List<SalesLedgerProduct> productList) {
+    public void addApproveByPurchase(LoginUser loginUser,PurchaseLedger purchaseLedger) throws Exception {
         if (loginUser == null) {
             return;
         }
-        ApprovalTemplate approvalTemplate = approvalTemplateMapper.selectOne(
-                new LambdaQueryWrapper<ApprovalTemplate>()
-                        .eq(ApprovalTemplate::getBusinessType, 5L)
-                        .eq(ApprovalTemplate::getDeleted, 0)
-                        .orderByDesc(ApprovalTemplate::getId)
-                        .last("LIMIT 1")
-        );
-        if (approvalTemplate == null) {
-            throw new BaseException("璇峰厛閰嶇疆閲囪喘瀹℃壒妯℃澘");
-        }
-
-        ApprovalInstanceDto approvalInstance = new ApprovalInstanceDto();
-        approvalInstance.setTemplateId(approvalTemplate.getId());
-        approvalInstance.setTemplateName(approvalTemplate.getTemplateName());
-        approvalInstance.setBusinessId(purchaseLedger.getId());
-        approvalInstance.setBusinessType(5L);
-        approvalInstance.setCurrentLevel(1);
-        approvalInstance.setApplicantId(loginUser.getUserId());
-        approvalInstance.setTitle(purchaseLedger.getPurchaseContractNumber()+"瀹℃壒");
-        approvalInstance.setApplicantName(loginUser.getNickName());
-        approvalInstance.setApplyTime(LocalDateTime.now());
-        PurchaseLedgerDto snapshot = new PurchaseLedgerDto();
-        BeanUtils.copyProperties(purchaseLedger, snapshot);
-        snapshot.setProductData(productList == null ? Collections.emptyList() : new ArrayList<>(productList));
-        approvalInstance.setFormConfig(JSON.toJSONString(snapshot));
-        approvalInstanceService.add(approvalInstance);
-
+        ApproveProcessVO approveProcessVO = new ApproveProcessVO();
+        approveProcessVO.setApproveType(5);
+        approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId());
+        approveProcessVO.setApproveReason(purchaseLedger.getPurchaseContractNumber());
+        approveProcessVO.setApproveUserIds(purchaseLedger.getApproveUserIds());
+        approveProcessVO.setApproveUser(loginUser.getUserId());
+        approveProcessVO.setApproveTime(LocalDate.now().toString());
+        approveProcessVO.setPrice(AmountUtils.scaleAmount(purchaseLedger.getContractAmount()));
+        approveProcessService.addApprove(approveProcessVO);
     }
 
     /**
@@ -1183,81 +672,22 @@
         return sb.toString();
     }
 
-    private static final String PURCHASE_LOCK_PREFIX = "purchase_contract_no:";
-    private static final long PURCHASE_LOCK_WAIT_TIMEOUT = 10;
-    private static final long PURCHASE_LOCK_EXPIRE_TIME = 30;
-
-    private String generatePurchaseContractNo(Date entryDate) {
-        LocalDate currentDate = entryDate != null ? DateUtils.toLocalDate(entryDate) : LocalDate.now();
-        String datePart = currentDate.format(DateTimeFormatter.BASIC_ISO_DATE);
-        String lockKey = PURCHASE_LOCK_PREFIX + datePart;
-        String lockValue = Thread.currentThread().getId() + "-" + System.nanoTime();
-
-        try {
-            long startWaitTime = System.currentTimeMillis();
-            while (System.currentTimeMillis() - startWaitTime < PURCHASE_LOCK_WAIT_TIMEOUT * 1000) {
-                Boolean locked = redisTemplate.opsForValue().setIfAbsent(lockKey, lockValue, PURCHASE_LOCK_EXPIRE_TIME, TimeUnit.SECONDS);
-                if (Boolean.TRUE.equals(locked)) {
-                    break;
-                }
-                try {
-                    Thread.sleep(100);
-                } catch (InterruptedException e) {
-                    Thread.currentThread().interrupt();
-                    throw new RuntimeException("鑾峰彇閿佹椂琚腑鏂�", e);
-                }
-            }
-
-            if (Boolean.FALSE.equals(redisTemplate.hasKey(lockKey))) {
-                throw new RuntimeException("鑾峰彇閲囪喘鍚堝悓缂栧彿鐢熸垚閿佸け璐ワ細瓒呮椂");
-            }
-
-            String prefix = "CG-" + datePart + "-";
-            List<PurchaseLedger> existingList = purchaseLedgerMapper.selectList(
-                    new LambdaQueryWrapper<PurchaseLedger>()
-                            .likeRight(PurchaseLedger::getPurchaseContractNumber, prefix)
-                            .select(PurchaseLedger::getPurchaseContractNumber));
-            List<Integer> existingSequences = existingList.stream()
-                    .map(PurchaseLedger::getPurchaseContractNumber)
-                    .filter(Objects::nonNull)
-                    .map(no -> {
-                        int lastDash = no.lastIndexOf('-');
-                        if (lastDash >= 0) {
-                            try {
-                                return Integer.parseInt(no.substring(lastDash + 1));
-                            } catch (NumberFormatException e) {
-                                return 0;
-                            }
-                        }
-                        return 0;
-                    })
-                    .collect(Collectors.toList());
-            int nextSequence = findFirstMissingSequence(existingSequences);
-
-            return prefix + String.format("%03d", nextSequence);
-        } finally {
-            String luaScript = "if redis.call('GET', KEYS[1]) == ARGV[1] then return redis.call('DEL', KEYS[1]) else return 0 end";
-            redisTemplate.execute(
-                    new org.springframework.data.redis.core.script.DefaultRedisScript<>(luaScript, Long.class),
-                    Collections.singletonList(lockKey),
-                    lockValue
-            );
+    @Override
+    public Map<String, Object> getPrintData(Long id) {
+        PurchaseLedger purchaseLedger = getById(id);
+        if (purchaseLedger == null) {
+            return null;
         }
-    }
-
-    private int findFirstMissingSequence(List<Integer> sequences) {
-        if (sequences.isEmpty()) {
-            return 1;
-        }
-        sequences.sort(Integer::compareTo);
-        int next = 1;
-        for (int seq : sequences) {
-            if (seq == next) {
-                next++;
-            } else if (seq > next) {
-                break;
-            }
-        }
-        return next;
+        List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(
+            new LambdaQueryWrapper<SalesLedgerProduct>()
+                .eq(SalesLedgerProduct::getSalesLedgerId, id)
+                .eq(SalesLedgerProduct::getType, 2)
+        );
+        SysDept dept = sysDeptMapper.selectDeptById(100L);
+        Map<String, Object> result = new HashMap<>();
+        result.put("companyName", dept != null ? dept.getDeptName() : "");
+        result.put("ledger", purchaseLedger);
+        result.put("products", products);
+        return result;
     }
 }
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseReturnOrdersServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseReturnOrdersServiceImpl.java
index dd8fa0f..318c36d 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseReturnOrdersServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseReturnOrdersServiceImpl.java
@@ -14,7 +14,6 @@
 import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
 import com.ruoyi.purchase.mapper.PurchaseReturnOrderProductsMapper;
 import com.ruoyi.purchase.mapper.PurchaseReturnOrdersMapper;
-import com.ruoyi.purchase.pojo.PurchaseLedger;
 import com.ruoyi.purchase.pojo.PurchaseReturnOrderProducts;
 import com.ruoyi.purchase.pojo.PurchaseReturnOrders;
 import com.ruoyi.purchase.service.PurchaseReturnOrdersService;
@@ -29,7 +28,6 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -77,18 +75,6 @@
             }
         }else {
             throw new RuntimeException("璇烽�夋嫨閫�璐у晢鍝�");
-        }
-
-        // 鏇存柊閲囪喘鍙拌处鐨勫疄闄呭悎鍚岄噾棰�
-        if (purchaseReturnOrderDto.getPurchaseLedgerId() != null && purchaseReturnOrderDto.getTotalAmount() != null) {
-            PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(purchaseReturnOrderDto.getPurchaseLedgerId());
-            if (purchaseLedger != null) {
-                BigDecimal baseAmount = purchaseLedger.getNetContractAmount() != null
-                        ? purchaseLedger.getNetContractAmount()
-                        : purchaseLedger.getContractAmount();
-                purchaseLedger.setNetContractAmount(baseAmount.subtract(purchaseReturnOrderDto.getTotalAmount()));
-                purchaseLedgerMapper.updateById(purchaseLedger);
-            }
         }
         return true;
     }
diff --git a/src/main/java/com/ruoyi/purchase/vo/PurchaseReturnOrderProductsDetailVo.java b/src/main/java/com/ruoyi/purchase/vo/PurchaseReturnOrderProductsDetailVo.java
index e50d5d0..dcd58b5 100644
--- a/src/main/java/com/ruoyi/purchase/vo/PurchaseReturnOrderProductsDetailVo.java
+++ b/src/main/java/com/ruoyi/purchase/vo/PurchaseReturnOrderProductsDetailVo.java
@@ -47,9 +47,6 @@
     @Schema(description = "宸查��璐ф暟閲�")
     private BigDecimal totalReturnNum;
 
-    @Schema(description = "閿�鍞彂璐ф暟閲�")
-    private BigDecimal saleOutQuantity;
-
     @Schema(description = "鍚◣鍗曚环")
     private BigDecimal taxInclusiveUnitPrice;
 
diff --git a/src/main/java/com/ruoyi/purchase/vo/PurchaseStockInProductVo.java b/src/main/java/com/ruoyi/purchase/vo/PurchaseStockInProductVo.java
index ff7754e..3f8e0ec 100644
--- a/src/main/java/com/ruoyi/purchase/vo/PurchaseStockInProductVo.java
+++ b/src/main/java/com/ruoyi/purchase/vo/PurchaseStockInProductVo.java
@@ -42,9 +42,6 @@
     @Schema(description = "閫�璐ф�绘暟")
     private BigDecimal totalReturnNum;
 
-    @Schema(description = "閿�鍞彂璐ф暟閲�")
-    private BigDecimal saleOutQuantity;
-
     @Schema(description = "鍚◣鍗曚环")
     private BigDecimal taxInclusiveUnitPrice;
 
diff --git a/src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsDetailsVo.java b/src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsDetailsVo.java
index 5cf592d..845825e 100644
--- a/src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsDetailsVo.java
+++ b/src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsDetailsVo.java
@@ -24,13 +24,10 @@
     @Schema(description = "鍚堝悓閲戦")
     private BigDecimal contractAmount;
 
-    @Schema(description = "浠樻閲戦")
-    private BigDecimal paymentAmount;
+    @Schema(description = "宸插叆搴撻噾棰�")
+    private BigDecimal shippedAmount;
 
-    @Schema(description = "搴斾粯閲戦")
-    private BigDecimal payableAmount;
-
-    @Schema(description = "閫�璐ч噾棰�")
-    private BigDecimal returnAmount;
+    @Schema(description = "鏈叆搴撻噾棰�")
+    private BigDecimal unshippedAmount;
 
 }
diff --git a/src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsVo.java b/src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsVo.java
index 2434017..df811bb 100644
--- a/src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsVo.java
+++ b/src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsVo.java
@@ -16,18 +16,12 @@
     private String supplierName;
 
     @Schema(description = "鍚堝悓鎬婚噾棰�")
-    //璇ヤ緵搴斿晢閲囪喘鍚堝悓绱閲戦
     private BigDecimal contractAmounts;
 
-    @Schema(description = "浠樻閲戦")
-    //璇ヤ緵搴斿晢閲囪喘浠樻绱閲戦
-    private BigDecimal paymentAmount;
+    @Schema(description = "宸插叆搴撻噾棰�")
+    private BigDecimal shippedAmount;
 
-    @Schema(description = "搴斾粯閲戦")
-    //璇ヤ緵搴斿晢閲囪喘搴斾粯绱閲戦=鍒濆閲戦-浠樻-閫�娆�
-    private BigDecimal payableAmount;
-
-    @Schema(description = "閫�璐ч噾棰�")
-    private BigDecimal returnAmount;
+    @Schema(description = "鏈叆搴撻噾棰�")
+    private BigDecimal unshippedAmount;
 
 }
diff --git a/src/main/java/com/ruoyi/quality/controller/QualityInspectFileController.java b/src/main/java/com/ruoyi/quality/controller/QualityInspectFileController.java
index bc5df62..742fef5 100644
--- a/src/main/java/com/ruoyi/quality/controller/QualityInspectFileController.java
+++ b/src/main/java/com/ruoyi/quality/controller/QualityInspectFileController.java
@@ -3,6 +3,8 @@
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.quality.pojo.QualityInspect;
 import com.ruoyi.quality.pojo.QualityInspectFile;
 import com.ruoyi.quality.pojo.QualityInspectParam;
@@ -33,6 +35,7 @@
      * @param qualityInspectFile
      * @return
      */
+    @Log(title = "涓婁紶璐ㄦ鏂囦欢", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public AjaxResult add(@RequestBody QualityInspectFile qualityInspectFile) {
         return AjaxResult.success(qualityInspectFileService.save(qualityInspectFile));
@@ -43,6 +46,7 @@
      * @param ids
      * @return
      */
+    @Log(title = "鍒犻櫎璐ㄦ鏂囦欢", businessType = BusinessType.DELETE)
     @DeleteMapping("/del")
     public AjaxResult delQualityUnqualified(@RequestBody List<Integer> ids) {
         if(CollectionUtils.isEmpty(ids)){
diff --git a/src/main/java/com/ruoyi/quality/controller/QualityTestStandardParamController.java b/src/main/java/com/ruoyi/quality/controller/QualityTestStandardParamController.java
index cc46446..16788c9 100644
--- a/src/main/java/com/ruoyi/quality/controller/QualityTestStandardParamController.java
+++ b/src/main/java/com/ruoyi/quality/controller/QualityTestStandardParamController.java
@@ -80,9 +80,7 @@
     @Operation(summary = "妫�娴嬫寚鏍囩淮鎶ゆ煡璇�")
     @Log(title = "妫�娴嬫寚鏍囩淮鎶ゆ煡璇�", businessType = BusinessType.OTHER)
     public R<?> list(Long testStandardId) {
-        return R.ok(qualityTestStandardParamService.list(Wrappers.<QualityTestStandardParam>lambdaQuery()
-                .eq(QualityTestStandardParam::getTestStandardId, testStandardId)
-                .orderByDesc(QualityTestStandardParam::getCreateTime)));
+        return R.ok(qualityTestStandardParamService.list(Wrappers.<QualityTestStandardParam>lambdaQuery().eq(QualityTestStandardParam::getTestStandardId,testStandardId)));
     }
 
 }
diff --git a/src/main/java/com/ruoyi/quality/pojo/QualityInspect.java b/src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
index 611bde8..04fc58b 100644
--- a/src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
+++ b/src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
@@ -38,7 +38,7 @@
     /**
      * 妫�娴嬫棩鏈�
      */
-    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     @Excel(name = "妫�娴嬫棩鏈�", width = 30, dateFormat = "yyyy-MM-dd")
     private Date checkTime;
 
@@ -107,6 +107,20 @@
     private BigDecimal unqualifiedQuantity;
 
     /**
+     * 鏄惁鎶芥(0:鍚�;1:鏄�)
+     */
+    @Excel(name = "鏄惁鎶芥", readConverterExp = "0=鍚�,1=鏄�")
+    @TableField("is_sampling")
+    private Integer isSampling;
+
+    /**
+     * 鎶芥鏁伴噺
+     */
+    @Excel(name = "鎶芥鏁伴噺")
+    @TableField("sampling_quantity")
+    private BigDecimal samplingQuantity;
+
+    /**
      * 妫�娴嬪崟浣�
      */
     @Excel(name = "妫�娴嬪崟浣�")
@@ -159,6 +173,13 @@
     @Schema(description = "鍏宠仈妫�娴嬫爣鍑嗕富琛╥d")
     private Long testStandardId;
 
+    /**
+     * 鍚堟牸鐜�
+     */
+    @TableField(exist = false)
+    @Excel(name = "鍚堟牸鐜�(%)")
+    private BigDecimal passRate;
+
 
     @TableField(fill = FieldFill.INSERT)
     private Long deptId;
diff --git a/src/main/java/com/ruoyi/quality/pojo/QualityUnqualified.java b/src/main/java/com/ruoyi/quality/pojo/QualityUnqualified.java
index e20f4be..249299a 100644
--- a/src/main/java/com/ruoyi/quality/pojo/QualityUnqualified.java
+++ b/src/main/java/com/ruoyi/quality/pojo/QualityUnqualified.java
@@ -47,7 +47,7 @@
     /**
      * 妫�娴嬫棩鏈�
      */
-    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     @Excel(name = "妫�娴嬫棩鏈�", width = 30, dateFormat = "yyyy-MM-dd")
     private Date checkTime;
 
@@ -107,7 +107,7 @@
     /**
      * 澶勭悊鏃ユ湡
      */
-    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     @Excel(name = "澶勭悊鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
     private Date dealTime;
 
diff --git a/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java b/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
index 8b42207..d78a5ca 100644
--- a/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
+++ b/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
@@ -3,7 +3,6 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.quality.dto.QualityInspectDto;
 import com.ruoyi.quality.pojo.QualityInspect;
 
@@ -23,8 +22,6 @@
     QualityInspectDto getDetailById(Integer id);
 
     int submit(QualityInspect qualityInspect);
-
-    R autoSubmit(Long id);
 
     void down(HttpServletResponse response, QualityInspect qualityInspect);
 }
diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
index 328c358..8ea03f0 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -11,7 +11,6 @@
 import com.deepoove.poi.config.Configure;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
 import com.ruoyi.common.exception.ServiceException;
-import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.HackLoopTableRenderPolicy;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.web.domain.R;
@@ -41,9 +40,8 @@
 import java.io.OutputStream;
 import java.math.BigDecimal;
 import java.net.URLEncoder;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -96,11 +94,7 @@
     public int submit(QualityInspect inspect) {
         QualityInspect qualityInspect = qualityInspectMapper.selectById(inspect.getId());
 
-        //鎻愪氦鍓嶅繀椤诲垽鏂槸鍚﹀悎鏍�
-        if (ObjectUtils.isNull(qualityInspect.getCheckResult())) {
-            throw new ServiceException("璇峰厛鍒ゆ柇鏄惁鍚堟牸");
-        }
-
+        //鎻愪氦鍓嶅繀椤诲垽鏂槸鍚﹀悎鏍硷紙閫氳繃鍚堟牸鏁伴噺鍜屼笉鍚堟牸鏁伴噺鏉ュ垽鏂級
         if (ObjectUtils.isNull(qualityInspect.getQualifiedQuantity())) {
             throw new ServiceException("鍚堟牸鏁伴噺涓嶈兘涓虹┖");
         }
@@ -131,15 +125,16 @@
             stockInventoryDto.setRecordId(qualityInspect.getId());
             stockInventoryDto.setProductModelId(qualityInspect.getProductModelId());
             stockInventoryDto.setQualitity(qualityInspect.getQualifiedQuantity());
-            if (qualityInspect.getCheckTime() != null) {
-                LocalDate stockCreateDate = DateUtils.toLocalDate(qualityInspect.getCheckTime()).plusDays(1);
-                stockInventoryDto.setCreateTime(LocalDateTime.of(stockCreateDate, java.time.LocalTime.MIDNIGHT));
-            }
             stockInventoryDto.setBatchNo(resolveProductionBatchNo(
                     qualityInspect.getProductMainId(),
                     qualityInspect.getId(),
                     qualityInspect.getProductModelId()));
             stockInventoryService.addStockInRecordOnly(stockInventoryDto);
+            //StockInRecord stockInRecord = stockInRecordService.getOne(Wrappers.<StockInRecord>lambdaQuery()
+            //        .eq(StockInRecord::getRecordId, qualityInspect.getId())
+            //        .eq(StockInRecord::getRecordType, stockInventoryDto.getRecordType())
+            //);
+            //stockInRecordService.batchApprove(Collections.singletonList(stockInRecord.getId()),1);
         }
         // 涓嶅悎鏍煎鐞�
         if(qualityInspect.getUnqualifiedQuantity().compareTo(BigDecimal.ZERO) > 0){
@@ -157,33 +152,6 @@
 
         qualityInspect.setInspectState(1);//宸叉彁浜�
         return qualityInspectMapper.updateById(qualityInspect);
-    }
-
-    @Override
-    public R autoSubmit(Long id) {
-        if (id == null) {
-            return R.fail("妫�楠屽崟ID涓嶈兘涓虹┖");
-        }
-        QualityInspect qualityInspect = qualityInspectMapper.selectById(id);
-        if (qualityInspect == null) {
-            return R.fail("妫�楠屽崟涓嶅瓨鍦�");
-        }
-        if (Integer.valueOf(1).equals(qualityInspect.getInspectState())) {
-            return R.ok("妫�楠屽崟宸叉彁浜�");
-        }
-
-        if (ObjectUtils.isNull(qualityInspect.getCheckResult())) {
-            qualityInspect.setCheckResult("鍚堟牸");
-        }
-        if (ObjectUtils.isNull(qualityInspect.getQualifiedQuantity())) {
-            qualityInspect.setQualifiedQuantity(qualityInspect.getQuantity() == null ? BigDecimal.ZERO : qualityInspect.getQuantity());
-        }
-        if (ObjectUtils.isNull(qualityInspect.getUnqualifiedQuantity())) {
-            qualityInspect.setUnqualifiedQuantity(BigDecimal.ZERO);
-        }
-        qualityInspectMapper.updateById(qualityInspect);
-        int rows = submit(qualityInspect);
-        return rows > 0 ? R.ok("妫�楠屽崟鎻愪氦鎴愬姛") : R.fail("妫�楠屽崟鎻愪氦澶辫触");
     }
 
     private String resolveProductionBatchNo(Long productionProductMainId,
diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityTestStandardBindingServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityTestStandardBindingServiceImpl.java
index a581977..8db41d6 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityTestStandardBindingServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityTestStandardBindingServiceImpl.java
@@ -9,6 +9,7 @@
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -32,16 +33,18 @@
 
     @Override
     public int add(List<QualityTestStandardBinding> qualityTestStandardBindings) {
+        ArrayList<QualityTestStandardBinding> qualityTestStandardBindings1 = new ArrayList<>(qualityTestStandardBindings.size());
         //鍒ゆ柇鏄惁宸茬粡鏈夌粦瀹氳繃鐨勬暟鎹�
         for (QualityTestStandardBinding qualityTestStandardBinding : qualityTestStandardBindings) {
             List<QualityTestStandardBinding> testStandardBindings = qualityTestStandardBindingMapper.selectList(Wrappers.<QualityTestStandardBinding>lambdaQuery()
                     .eq(QualityTestStandardBinding::getTestStandardId, qualityTestStandardBinding.getTestStandardId())
                     .eq(QualityTestStandardBinding::getProductId, qualityTestStandardBinding.getProductId()));
             if (testStandardBindings.size() > 0){
-                throw new RuntimeException("璇ヤ骇鍝佸凡缁忕粦瀹氳繃,璇锋鏌�");
+                continue;
             }
+            qualityTestStandardBindings1.add(qualityTestStandardBinding);
         }
-        saveBatch(qualityTestStandardBindings);
+        saveBatch(qualityTestStandardBindings1);
         return 0;
     }
 }
diff --git a/src/main/java/com/ruoyi/safe/controller/SafeAccidentController.java b/src/main/java/com/ruoyi/safe/controller/SafeAccidentController.java
index 400998a..f37f6ef 100644
--- a/src/main/java/com/ruoyi/safe/controller/SafeAccidentController.java
+++ b/src/main/java/com/ruoyi/safe/controller/SafeAccidentController.java
@@ -1,6 +1,8 @@
 package com.ruoyi.safe.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.safe.pojo.SafeAccident;
 import com.ruoyi.safe.service.SafeAccidentService;
@@ -34,18 +36,21 @@
     }
 
     @Operation(summary = "鏂板浜嬫晠涓婃姤璁板綍")
+    @Log(title = "瀹夊叏浜嬫晠", businessType = BusinessType.INSERT)
     @PostMapping()
     public R add(@RequestBody SafeAccident safeAccident) {
         return R.ok(safeAccidentService.save(safeAccident));
     }
 
     @Operation(summary = "淇敼浜嬫晠涓婃姤璁板綍")
+    @Log(title = "瀹夊叏浜嬫晠", businessType = BusinessType.UPDATE)
     @PutMapping ()
     public R update(@RequestBody  SafeAccident safeAccident) {
         return R.ok(safeAccidentService.updateById(safeAccident));
     }
 
     @Operation(summary = "鍒犻櫎浜嬫晠涓婃姤璁板綍")
+    @Log(title = "瀹夊叏浜嬫晠", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R delSafeAccident(@RequestBody List<Integer> ids) {
         return R.ok(safeAccidentService.removeBatchByIds(ids));
diff --git a/src/main/java/com/ruoyi/safe/controller/SafeCertificationController.java b/src/main/java/com/ruoyi/safe/controller/SafeCertificationController.java
index bdedc46..824e219 100644
--- a/src/main/java/com/ruoyi/safe/controller/SafeCertificationController.java
+++ b/src/main/java/com/ruoyi/safe/controller/SafeCertificationController.java
@@ -1,6 +1,8 @@
 package com.ruoyi.safe.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.safe.pojo.SafeCertification;
 import com.ruoyi.safe.service.SafeCertificationService;
@@ -35,18 +37,21 @@
     }
 
     @Operation(summary = "鏂板瀹夊叏瑙勭▼涓庤祫璐ㄧ鐞�")
+    @Log(title = "瀹夊叏璇佷功", businessType = BusinessType.INSERT)
     @PostMapping()
     public R add(@RequestBody SafeCertification safeCertification) {
         return R.ok(safeCertificationService.save(safeCertification));
     }
 
     @Operation(summary = "淇敼瀹夊叏瑙勭▼涓庤祫璐ㄧ鐞�")
+    @Log(title = "瀹夊叏璇佷功", businessType = BusinessType.UPDATE)
     @PutMapping ()
     public R update(@RequestBody  SafeCertification safeCertification) {
         return R.ok(safeCertificationService.updateById(safeCertification));
     }
 
     @Operation(summary = "鍒犻櫎瀹夊叏瑙勭▼涓庤祫璐ㄧ鐞�")
+    @Log(title = "瀹夊叏璇佷功", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R delSafeCertification(@RequestBody List<Integer> ids) {
         return R.ok(safeCertificationService.removeBatchByIds(ids));
diff --git a/src/main/java/com/ruoyi/safe/controller/SafeCertificationFileController.java b/src/main/java/com/ruoyi/safe/controller/SafeCertificationFileController.java
index 49e3e1d..dd8c6de 100644
--- a/src/main/java/com/ruoyi/safe/controller/SafeCertificationFileController.java
+++ b/src/main/java/com/ruoyi/safe/controller/SafeCertificationFileController.java
@@ -2,6 +2,8 @@
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 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.R;
 import com.ruoyi.safe.pojo.SafeCertificationFile;
 import com.ruoyi.safe.service.SafeCertificationFileService;
@@ -35,6 +37,7 @@
      * @param safeCertificationFile
      * @return
      */
+    @Log(title = "鏂板瀹夊叏璇佷功鏂囦欢", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     @Operation(summary = "鏂板")
     public R add(@RequestBody SafeCertificationFile safeCertificationFile) {
@@ -46,6 +49,7 @@
      * @param ids
      * @return
      */
+    @Log(title = "鍒犻櫎瀹夊叏璇佷功鏂囦欢", businessType = BusinessType.DELETE)
     @DeleteMapping("/del")
     @Operation(summary = "鍒犻櫎")
     public R delSafeCertificationFile(@RequestBody List<Integer> ids) {
diff --git a/src/main/java/com/ruoyi/safe/controller/SafeContingencyPlanController.java b/src/main/java/com/ruoyi/safe/controller/SafeContingencyPlanController.java
index d5d835d..75844dc 100644
--- a/src/main/java/com/ruoyi/safe/controller/SafeContingencyPlanController.java
+++ b/src/main/java/com/ruoyi/safe/controller/SafeContingencyPlanController.java
@@ -1,6 +1,8 @@
 package com.ruoyi.safe.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.safe.pojo.SafeContingencyPlan;
 import com.ruoyi.safe.service.SafeContingencyPlanService;
@@ -33,18 +35,21 @@
         return R.ok(safeContingencyPlanService.pageSafeContingencyPlan(page, safeContingencyPlan));
     }
 
+    @Log(title = "鏂板搴旀�ラ妗�", businessType = BusinessType.INSERT)
     @Operation(summary = "鏂板搴旀�ラ妗堟煡闃�")
     @PostMapping()
     public R add(@RequestBody SafeContingencyPlan safeContingencyPlan) {
         return R.ok(safeContingencyPlanService.save(safeContingencyPlan));
     }
 
+    @Log(title = "淇敼搴旀�ラ妗�", businessType = BusinessType.UPDATE)
     @Operation(summary = "淇敼搴旀�ラ妗堟煡闃�")
     @PutMapping ()
     public R update(@RequestBody  SafeContingencyPlan safeContingencyPlan) {
         return R.ok(safeContingencyPlanService.updateById(safeContingencyPlan));
     }
 
+    @Log(title = "鍒犻櫎搴旀�ラ妗�", businessType = BusinessType.DELETE)
     @Operation(summary = "鍒犻櫎搴旀�ラ妗堟煡闃�")
     @DeleteMapping("/{ids}")
     public R delSafeCertification(@RequestBody List<Integer> ids) {
diff --git a/src/main/java/com/ruoyi/safe/controller/SafeHazardController.java b/src/main/java/com/ruoyi/safe/controller/SafeHazardController.java
index b433d04..493ff73 100644
--- a/src/main/java/com/ruoyi/safe/controller/SafeHazardController.java
+++ b/src/main/java/com/ruoyi/safe/controller/SafeHazardController.java
@@ -1,6 +1,8 @@
 package com.ruoyi.safe.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.safe.pojo.SafeHazard;
 import com.ruoyi.safe.service.SafeHazardService;
@@ -33,18 +35,21 @@
         return R.ok(safeHazardService.pageSafeHazard(page, safeHazard));
     }
 
+    @Log(title = "鏂板鍗遍櫓婧�", businessType = BusinessType.INSERT)
     @Operation(summary = "鏂板鍗遍櫓婧愬彴璐�")
     @PostMapping()
     public R add(@RequestBody SafeHazard safeHazard) {
         return R.ok(safeHazardService.save(safeHazard));
     }
 
+    @Log(title = "淇敼鍗遍櫓婧�", businessType = BusinessType.UPDATE)
     @Operation(summary = "淇敼鍗遍櫓婧愬彴璐�")
     @PutMapping ()
     public R update(@RequestBody  SafeHazard safeHazard) {
         return R.ok(safeHazardService.updateById(safeHazard));
     }
 
+    @Log(title = "鍒犻櫎鍗遍櫓婧�", businessType = BusinessType.DELETE)
     @Operation(summary = "鍒犻櫎鍗遍櫓婧愬彴璐�")
     @DeleteMapping("/{ids}")
     public R delSafeHazard(@RequestBody List<Integer> ids) {
diff --git a/src/main/java/com/ruoyi/safe/controller/SafeHazardRecordController.java b/src/main/java/com/ruoyi/safe/controller/SafeHazardRecordController.java
index 681efa5..a8bb0c6 100644
--- a/src/main/java/com/ruoyi/safe/controller/SafeHazardRecordController.java
+++ b/src/main/java/com/ruoyi/safe/controller/SafeHazardRecordController.java
@@ -1,6 +1,8 @@
 package com.ruoyi.safe.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.safe.dto.SafeHazardRecordDto;
 import com.ruoyi.safe.pojo.SafeHazardRecord;
@@ -35,18 +37,21 @@
     }
 
     @Operation(summary = "棰嗙敤")
+    @Log(title = "鍗遍櫓婧愯褰�", businessType = BusinessType.INSERT)
     @PostMapping("/borrow")
     public R borrow(@RequestBody SafeHazardRecord safeHazardRecord) {
         return R.ok(safeHazardRecordService.borrow(safeHazardRecord));
     }
 
     @Operation(summary = "褰掕繕")
+    @Log(title = "鍗遍櫓婧愯褰�", businessType = BusinessType.UPDATE)
     @PutMapping("/return")
     public R returnSafeHazardRecord(@RequestBody  SafeHazardRecord safeHazardRecord) {
         return R.ok(safeHazardRecordService.returnSafeHazardRecord(safeHazardRecord));
     }
 
     @Operation(summary = "鍒犻櫎")
+    @Log(title = "鍗遍櫓婧愯褰�", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R delSafeHazardRecord(@RequestBody List<Integer> ids) {
         return R.ok(safeHazardRecordService.delSafeHazardRecord(ids));
diff --git a/src/main/java/com/ruoyi/safe/controller/SafeHiddenController.java b/src/main/java/com/ruoyi/safe/controller/SafeHiddenController.java
index f77f294..a7cff40 100644
--- a/src/main/java/com/ruoyi/safe/controller/SafeHiddenController.java
+++ b/src/main/java/com/ruoyi/safe/controller/SafeHiddenController.java
@@ -1,6 +1,8 @@
 package com.ruoyi.safe.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.safe.dto.SafeHiddenDto;
 import com.ruoyi.safe.pojo.SafeHidden;
@@ -35,18 +37,21 @@
     }
 
     @Operation(summary = "鏂板闅愭偅鎺掓煡")
+    @Log(title = "瀹夊叏闅愭偅", businessType = BusinessType.INSERT)
     @PostMapping()
     public R add(@RequestBody SafeHidden safeHidden) {
         return R.ok(safeHiddenService.add(safeHidden));
     }
 
     @Operation(summary = "淇敼闅愭偅鎺掓煡(鏁存敼/楠屾敹)")
+    @Log(title = "瀹夊叏闅愭偅", businessType = BusinessType.UPDATE)
     @PutMapping ()
     public R update(@RequestBody SafeHidden safeHidden) {
         return R.ok(safeHiddenService.updateById(safeHidden));
     }
 
     @Operation(summary = "鍒犻櫎闅愭偅鎺掓煡")
+    @Log(title = "瀹夊叏闅愭偅", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R delSafeHidden(@RequestBody List<Integer> ids) {
         return R.ok(safeHiddenService.delSafeHidden(ids));
diff --git a/src/main/java/com/ruoyi/safe/controller/SafeHiddenFileController.java b/src/main/java/com/ruoyi/safe/controller/SafeHiddenFileController.java
index 511bdb7..8070bba 100644
--- a/src/main/java/com/ruoyi/safe/controller/SafeHiddenFileController.java
+++ b/src/main/java/com/ruoyi/safe/controller/SafeHiddenFileController.java
@@ -2,6 +2,8 @@
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 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.R;
 import com.ruoyi.safe.pojo.SafeHiddenFile;
 import com.ruoyi.safe.service.SafeHiddenFileService;
@@ -35,6 +37,7 @@
      * @param safeHiddenFile
      * @return
      */
+    @Log(title = "鏂板闅愭偅鏂囦欢", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     @Operation(summary = "鏂板")
     public R add(@RequestBody SafeHiddenFile safeHiddenFile) {
@@ -46,6 +49,7 @@
      * @param ids
      * @return
      */
+    @Log(title = "鍒犻櫎闅愭偅鏂囦欢", businessType = BusinessType.DELETE)
     @DeleteMapping("/del")
     @Operation(summary = "鍒犻櫎")
     public R delSafeHiddenFile(@RequestBody List<Integer> ids) {
diff --git a/src/main/java/com/ruoyi/safe/controller/SafeTrainingController.java b/src/main/java/com/ruoyi/safe/controller/SafeTrainingController.java
index dd8b6f5..a1cd796 100644
--- a/src/main/java/com/ruoyi/safe/controller/SafeTrainingController.java
+++ b/src/main/java/com/ruoyi/safe/controller/SafeTrainingController.java
@@ -1,6 +1,8 @@
 package com.ruoyi.safe.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.safe.dto.SafeTrainingDto;
 import com.ruoyi.safe.pojo.SafeTraining;
@@ -39,12 +41,14 @@
     }
 
     @Operation(summary = "鏂板/缂栬緫瀹夊叏鍩硅鑰冩牳")
+    @Log(title = "瀹夊叏鍩硅", businessType = BusinessType.INSERT)
     @PostMapping()
     public R addOrUpdate(@RequestBody SafeTraining safeTraining) {
         return R.ok(safeTrainingService.addOrUpdate(safeTraining));
     }
 
     @Operation(summary = "绛惧埌")
+    @Log(title = "瀹夊叏鍩硅", businessType = BusinessType.INSERT)
     @PostMapping ("/sign")
     public R sign(@RequestBody SafeTrainingDetails safeTrainingDetails) {
         return R.ok(safeTrainingDetailsService.save(safeTrainingDetails));
@@ -57,18 +61,21 @@
     }
 
     @Operation(summary = "缁撴灉鏄庣粏淇濆瓨")
+    @Log(title = "瀹夊叏鍩硅", businessType = BusinessType.UPDATE)
     @PostMapping ("/saveSafeTraining")
     public R saveSafeTraining(@RequestBody SafeTrainingDto safeTrainingDto) {
         return R.ok(safeTrainingService.saveSafeTraining(safeTrainingDto));
     }
 
     @Operation(summary = "鍒犻櫎瀹夊叏鍩硅鑰冩牳")
+    @Log(title = "瀹夊叏鍩硅", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R delSafeTraining(@RequestBody List<Integer> ids) {
         return R.ok(safeTrainingService.delSafeTraining(ids));
     }
 
     @Operation(summary = "瀵煎嚭")
+    @Log(title = "瀹夊叏鍩硅", businessType = BusinessType.EXPORT)
     @PostMapping ("/export")
     public void export(HttpServletResponse response, @RequestBody SafeTraining safeTraining) {
         safeTrainingService.export(response,safeTraining.getId());
diff --git a/src/main/java/com/ruoyi/safe/controller/SafeTrainingDetailsController.java b/src/main/java/com/ruoyi/safe/controller/SafeTrainingDetailsController.java
index 63a03e4..bc692ca 100644
--- a/src/main/java/com/ruoyi/safe/controller/SafeTrainingDetailsController.java
+++ b/src/main/java/com/ruoyi/safe/controller/SafeTrainingDetailsController.java
@@ -1,6 +1,8 @@
 package com.ruoyi.safe.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.safe.pojo.SafeTrainingDetails;
 import com.ruoyi.safe.service.SafeTrainingDetailsService;
@@ -33,6 +35,7 @@
         return R.ok(safeTrainingDetailsService.pageDetails(page, safeTrainingDetails));
     }
 
+    @Log(title = "瀵煎嚭鍩硅璇︽儏", businessType = BusinessType.EXPORT)
     @Operation(summary = "瀵煎嚭")
     @PostMapping("/export")
     public void export(HttpServletResponse response, @RequestBody SafeTrainingDetails safeTrainingDetails) {
diff --git a/src/main/java/com/ruoyi/safe/controller/SafeTrainingFileController.java b/src/main/java/com/ruoyi/safe/controller/SafeTrainingFileController.java
index 5d18a03..e82c121 100644
--- a/src/main/java/com/ruoyi/safe/controller/SafeTrainingFileController.java
+++ b/src/main/java/com/ruoyi/safe/controller/SafeTrainingFileController.java
@@ -2,6 +2,8 @@
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 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.R;
 import com.ruoyi.safe.pojo.SafeHiddenFile;
 import com.ruoyi.safe.pojo.SafeTrainingFile;
@@ -36,6 +38,7 @@
      * @param safeHiddenFile
      * @return
      */
+    @Log(title = "鏂板鍩硅鏂囦欢", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     @Operation(summary = "鏂板")
     public R add(@RequestBody SafeTrainingFile safeHiddenFile) {
@@ -47,6 +50,7 @@
      * @param ids
      * @return
      */
+    @Log(title = "鍒犻櫎鍩硅鏂囦欢", businessType = BusinessType.DELETE)
     @DeleteMapping("/del")
     @Operation(summary = "鍒犻櫎")
     public R delSafeHiddenFile(@RequestBody List<Integer> ids) {
diff --git a/src/main/java/com/ruoyi/sales/controller/PaymentShippingController.java b/src/main/java/com/ruoyi/sales/controller/PaymentShippingController.java
index f4d8497..75e27f3 100644
--- a/src/main/java/com/ruoyi/sales/controller/PaymentShippingController.java
+++ b/src/main/java/com/ruoyi/sales/controller/PaymentShippingController.java
@@ -4,6 +4,8 @@
 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.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.PaymentShippingMapper;
@@ -15,7 +17,6 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
-import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -38,16 +39,18 @@
         return AjaxResult.success(listPage);
     }
 
+    @Log(title = "浠樻鍙戣揣", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     @Operation(summary = "娣诲姞鏀粯涓庡彂璐т俊鎭�")
     @Transactional(rollbackFor = Exception.class)
     public AjaxResult add(@RequestBody PaymentShipping paymentShipping) {
-        String ord = OrderUtils.countTodayByCreateTime(paymentShippingMapper, "ORD","order_no", paymentShipping.getCreateTime() != null ? paymentShipping.getCreateTime() : LocalDateTime.now());
+        String ord = OrderUtils.countTodayByCreateTime(paymentShippingMapper, "ORD","order_no");
         paymentShipping.setOrderNo(ord);
         boolean save = paymentShippingService.save(paymentShipping);
         return save ? success() : error();
     }
 
+    @Log(title = "浠樻鍙戣揣", businessType = BusinessType.UPDATE)
     @PostMapping("/update")
     @Operation(summary = "淇敼鏀粯涓庡彂璐т俊鎭�")
     @Transactional(rollbackFor = Exception.class)
@@ -56,6 +59,7 @@
         return update ? success() : error();
     }
 
+    @Log(title = "浠樻鍙戣揣", businessType = BusinessType.DELETE)
     @DeleteMapping("/delete")
     @Operation(summary = "鍒犻櫎鏀粯涓庡彂璐т俊鎭�")
     @Transactional(rollbackFor = Exception.class)
diff --git a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
index ea18246..33ab62f 100644
--- a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
+++ b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -262,7 +262,7 @@
 
             //  濡傛灉宸茬粡鏈夎繃寮�绁ㄦ垨鍥炴鎿嶄綔,鍒欎笉鍏佽缂栬緫
             boolean hasReceiptOperation = receiptPaymentAmountTotal.compareTo(BigDecimal.ZERO) > 0;
-            salesLedgerVo.setIsEdit(!hasReceiptOperation);
+            salesLedgerVo.setIsEdit(hasReceiptOperation);
 
             salesLedgerVo.setStorageBlobVOs(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.FILE, RecordTypeEnum.SALES_LEDGER, ledgerId));
         }
@@ -281,4 +281,14 @@
     public R getSalesLedgerWithProductsLoss(Long salesLedgerId) {
         return R.ok(salesLedgerService.getSalesLedgerWithProductsLoss(salesLedgerId));
     }
+
+    @Operation(summary = "鑾峰彇閿�鍞崟鎵撳嵃鏁版嵁")
+    @GetMapping("/printData/{id}")
+    public AjaxResult printData(@PathVariable Long id) {
+        Map<String, Object> data = salesLedgerService.getPrintData(id);
+        if (data == null) {
+            return AjaxResult.error("閿�鍞崟涓嶅瓨鍦�");
+        }
+        return AjaxResult.success(data);
+    }
 }
diff --git a/src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java b/src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
index f04417e..6d45432 100644
--- a/src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
+++ b/src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
@@ -7,13 +7,20 @@
 import com.ruoyi.framework.web.controller.BaseController;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.procurementrecord.service.ProcurementRecordService;
+import com.ruoyi.procurementrecord.utils.StockUtils;
+import com.ruoyi.purchase.dto.SimpleReturnOrderGroupDto;
+import com.ruoyi.purchase.mapper.PurchaseReturnOrderProductsMapper;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.service.ISalesLedgerProductService;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.*;
 
+import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 浜у搧淇℃伅Controller
@@ -27,6 +34,9 @@
 public class SalesLedgerProductController extends BaseController
 {
     private final ISalesLedgerProductService salesLedgerProductService;
+    private final ProcurementRecordService procurementRecordService;
+    private final StockUtils stockUtils;
+    private final PurchaseReturnOrderProductsMapper purchaseReturnOrderProductsMapper;
 
 
     /**
@@ -35,32 +45,26 @@
     @GetMapping("/list")
     public AjaxResult list(SalesLedgerProduct salesLedgerProduct) {
         List<SalesLedgerProduct> list = salesLedgerProductService.selectSalesLedgerProductList(salesLedgerProduct);
-        if (CollUtil.isNotEmpty(list)) {
-            list.forEach(item -> {
-                if (item.getApproveStatus() != 2) {
-                    if (item.getHasSufficientStock() == 0) {
-                        item.setApproveStatus(0);
-                    } else {
-                        item.setApproveStatus(1);
-                    }
-                }
-                java.math.BigDecimal returnQuantity = item.getReturnQuantity() == null
-                        ? java.math.BigDecimal.ZERO
-                        : item.getReturnQuantity();
-                item.setReturnQuantity(returnQuantity);
-                java.math.BigDecimal availableQuality = item.getQuantity() == null
-                        ? java.math.BigDecimal.ZERO
-                        : item.getQuantity();
-                if (item.getType() != null && item.getType() == 2) {
-                    availableQuality = item.getApprovedStockInNum() == null
-                            ? java.math.BigDecimal.ZERO
-                            : item.getApprovedStockInNum();
-                    availableQuality = availableQuality
-                            .subtract(item.getShippedQuantity() == null ? java.math.BigDecimal.ZERO : item.getShippedQuantity());
-                }
-                item.setAvailableQuality(availableQuality.subtract(returnQuantity));
-            });
+        if (CollUtil.isEmpty(list)) {
+            return AjaxResult.success(list);
         }
+        List<Long> productIds = list.stream().map(SalesLedgerProduct::getProductModelId).collect(Collectors.toList());
+        List<SimpleReturnOrderGroupDto> groupListByProductIds = purchaseReturnOrderProductsMapper.getReturnOrderGroupListByProductIds(productIds);
+        Map<Long, BigDecimal> returnOrderGroupDtoMap = groupListByProductIds.stream().collect(Collectors.toMap(SimpleReturnOrderGroupDto::getProductModelId, item -> item.getSumReturnQuantity()));
+
+        list.forEach(item -> {
+            if (item.getApproveStatus() != 2) {
+                if (item.getHasSufficientStock() == 0) {
+                    item.setApproveStatus(0);
+                } else {
+                    item.setApproveStatus(1);
+                }
+            }
+            // 缁熻閫�璐ф暟閲�
+            BigDecimal returnQuality = returnOrderGroupDtoMap.getOrDefault(item.getProductModelId(), BigDecimal.ZERO);
+            item.setReturnQuality(returnQuality);
+            item.setAvailableQuality(item.getQuantity().subtract(returnQuality));
+        });
         return AjaxResult.success(list);
     }
 
diff --git a/src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java b/src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java
index f9251f8..929a17a 100644
--- a/src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java
+++ b/src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java
@@ -3,6 +3,8 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.sales.dto.SalesQuotationDto;
 import com.ruoyi.sales.service.SalesQuotationService;
@@ -21,6 +23,7 @@
     }
 
 
+    @Log(title = "閿�鍞姤浠�", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response) {
         Page page = new Page(-1,-1);
@@ -31,14 +34,17 @@
     }
 
 
+    @Log(title = "閿�鍞姤浠�", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public AjaxResult add(@RequestBody SalesQuotationDto salesQuotationDto) {
         return AjaxResult.success(salesQuotationService.add(salesQuotationDto));
     }
+    @Log(title = "閿�鍞姤浠�", businessType = BusinessType.UPDATE)
     @PostMapping("/update")
     public AjaxResult update(@RequestBody SalesQuotationDto salesQuotationDto) {
         return AjaxResult.success(salesQuotationService.edit(salesQuotationDto));
     }
+    @Log(title = "閿�鍞姤浠�", businessType = BusinessType.DELETE)
     @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
index 5f64f8c..543a139 100644
--- a/src/main/java/com/ruoyi/sales/controller/SalespersonManagementController.java
+++ b/src/main/java/com/ruoyi/sales/controller/SalespersonManagementController.java
@@ -2,6 +2,8 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.sales.pojo.SalespersonManagement;
@@ -33,6 +35,7 @@
         return AjaxResult.success(listPage);
     }
 
+    @Log(title = "涓氬姟鍛樼鐞�", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     @Operation(summary = "娣诲姞涓氬姟鍛樹俊鎭�")
     @Transactional(rollbackFor = Exception.class)
@@ -41,6 +44,7 @@
         return save ? AjaxResult.success() : AjaxResult.error();
     }
 
+    @Log(title = "涓氬姟鍛樼鐞�", businessType = BusinessType.UPDATE)
     @PostMapping("/update")
     @Operation(summary = "淇敼涓氬姟鍛樹俊鎭�")
     @Transactional(rollbackFor = Exception.class)
@@ -49,6 +53,7 @@
         return update ? AjaxResult.success() : AjaxResult.error();
     }
 
+    @Log(title = "涓氬姟鍛樼鐞�", businessType = BusinessType.DELETE)
     @DeleteMapping("/delete")
     @Operation(summary = "鍒犻櫎涓氬姟鍛樹俊鎭�")
     @Transactional(rollbackFor = Exception.class)
diff --git a/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java b/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
index 552aaa9..5f02d86 100644
--- a/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
+++ b/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
@@ -2,10 +2,14 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.approve.bean.vo.ApproveProcessVO;
 import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl;
+import com.ruoyi.common.utils.OrderUtils;
+import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
+import com.ruoyi.framework.security.LoginUser;
 import com.ruoyi.framework.web.controller.BaseController;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.framework.web.domain.R;
@@ -21,6 +25,7 @@
 import org.springframework.web.bind.annotation.*;
 
 import java.io.IOException;
+import java.time.LocalDate;
 import java.util.List;
 
 /**
@@ -50,7 +55,22 @@
     @Transactional(rollbackFor = Exception.class)
     @Log(title = "鍙戣揣淇℃伅绠$悊", businessType = BusinessType.INSERT)
     public AjaxResult add(@RequestBody ShippingInfoDto req) throws Exception {
-        return AjaxResult.success(shippingInfoService.addReq(req) ? "娣诲姞鎴愬姛" : "娣诲姞澶辫触");
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        String sh = OrderUtils.countTodayByCreateTime(shippingInfoMapper, "SH","shipping_no");
+        // 鍙戣揣瀹℃壒
+        ApproveProcessVO approveProcessVO = new ApproveProcessVO();
+        approveProcessVO.setApproveType(7);
+        approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId());
+        approveProcessVO.setApproveReason(sh);//鍙戣揣缂栧彿
+        approveProcessVO.setApproveUserIds(req.getApproveUserIds());
+        approveProcessVO.setApproveUser(loginUser.getUserId());
+        approveProcessVO.setApproveTime(LocalDate.now().toString());
+        approveProcessService.addApprove(approveProcessVO);
+        // 娣诲姞鍙戣揣娑堟伅
+        req.setShippingNo(sh);
+        req.setStatus("寰呭鏍�");
+        boolean save = shippingInfoService.add(req);
+        return save ? AjaxResult.success() : AjaxResult.error();
     }
 
     @Operation(summary = "鍙戣揣鎵e簱瀛�")
@@ -86,6 +106,7 @@
     /**
      * 瀵煎嚭鍙戣揣淇℃伅绠$悊
      */
+    @Log(title = "鍙戣揣淇℃伅", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     @Operation(summary = "瀵煎嚭鍙戣揣淇℃伅")
     public void export(HttpServletResponse response) {
diff --git a/src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java b/src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
index a4fc57c..c119e94 100644
--- a/src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
+++ b/src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
@@ -19,7 +19,7 @@
     private String salesContractNo;
     private String customerContractNo;
     private String projectName;
-    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     private Date entryDate;
 
     private String entryDateStart;
diff --git a/src/main/java/com/ruoyi/sales/dto/SalesQuotationDto.java b/src/main/java/com/ruoyi/sales/dto/SalesQuotationDto.java
index 4b20ff8..4841ffd 100644
--- a/src/main/java/com/ruoyi/sales/dto/SalesQuotationDto.java
+++ b/src/main/java/com/ruoyi/sales/dto/SalesQuotationDto.java
@@ -17,6 +17,4 @@
      */
     // 瀹℃壒浜�
     private String approveUserIds;
-
-    private Long templateId;
 }
diff --git a/src/main/java/com/ruoyi/sales/dto/SalesTrendDto.java b/src/main/java/com/ruoyi/sales/dto/SalesTrendDto.java
index 36a8290..cb4c4d9 100644
--- a/src/main/java/com/ruoyi/sales/dto/SalesTrendDto.java
+++ b/src/main/java/com/ruoyi/sales/dto/SalesTrendDto.java
@@ -14,6 +14,7 @@
     private String month; // 鏈堜唤锛堝2024-12锛�
     private Integer orderCount; // 璁㈠崟鏁�
     private BigDecimal salesAmount; // 閿�鍞
+    private BigDecimal productQuantity; // 浜у搧閿�鍞暟閲�
     private BigDecimal shipRate;
 
 }
diff --git a/src/main/java/com/ruoyi/sales/dto/ShippingInfoDto.java b/src/main/java/com/ruoyi/sales/dto/ShippingInfoDto.java
index 724473a..43409bc 100644
--- a/src/main/java/com/ruoyi/sales/dto/ShippingInfoDto.java
+++ b/src/main/java/com/ruoyi/sales/dto/ShippingInfoDto.java
@@ -47,9 +47,5 @@
     //鍙戣揣鏁伴噺
     private BigDecimal totalQuantity;
 
-    private Long templateId;
-
-    private String templateName;
-
 
 }
diff --git a/src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java b/src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java
index 5518290..0270328 100644
--- a/src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java
+++ b/src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java
@@ -66,6 +66,7 @@
             "DATE_FORMAT(sl.entry_date, '%Y-%m') AS month, " +
             "COUNT(DISTINCT sl.id) AS order_count, " +  // 鎬昏鍗曟暟
             "SUM(slp.tax_inclusive_total_price) AS sales_amount, " +  // 閿�鍞
+            "SUM(IFNULL(slp.quantity, 0)) AS product_quantity, " +  // 浜у搧閿�鍞暟閲�
             // 鍙戣揣鐜� = 鍙戣揣璁㈠崟鏁� * 100 / 鎬昏鍗曟暟锛堜繚鐣�2浣嶅皬鏁帮紝閬垮厤闄�0鎶ラ敊锛�
             "ROUND(IF(COUNT(DISTINCT sl.id) = 0, 0, " +
             "SUM(CASE WHEN slp.approve_status = 2 THEN 1 ELSE 0 END) / COUNT(DISTINCT sl.id) * 100), 2) AS ship_rate " +
diff --git a/src/main/java/com/ruoyi/sales/pojo/PaymentShipping.java b/src/main/java/com/ruoyi/sales/pojo/PaymentShipping.java
index 8c37b72..51589cd 100644
--- a/src/main/java/com/ruoyi/sales/pojo/PaymentShipping.java
+++ b/src/main/java/com/ruoyi/sales/pojo/PaymentShipping.java
@@ -60,6 +60,7 @@
     private String remark;
 
     @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
     private LocalDateTime createTime;
 
     @Schema(description = "鍒涘缓鐢ㄦ埛")
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
index c8a0443..00736ba 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -50,7 +50,7 @@
     /**
      * 褰曞叆鏃ユ湡
      */
-    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     @Excel(name = "褰曞叆鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     private Date entryDate;
@@ -108,9 +108,6 @@
 
     @Schema(description = "浠樻鏂瑰紡")
     private String paymentMethod;
-
-    @Schema(description = "瀹為檯鍚堝悓閲戦")
-    private BigDecimal netContractAmount;
 
     @TableField(exist = false)
     @Schema(description = "鐢熶骇鐘舵��")
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
index 9bcbd07..f4a42d6 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -164,7 +164,11 @@
     @TableField(exist = false)
     private Integer hasSufficientStock;
 
-    // 鍙敤鏁伴噺  quantity - returnQuantity
+    // 閫�璐ф暟閲�
+    @TableField(exist = false)
+    private BigDecimal returnQuality;
+
+    // 鍙敤鏁伴噺  quantity - returnQuality
     @TableField(exist = false)
     private BigDecimal availableQuality;
     @Schema(description = "鍒涘缓鐢ㄦ埛")
@@ -181,20 +185,4 @@
     @TableField(exist = false)
     @Schema(description = "寰呭彂璐ф暟閲�")
     private BigDecimal noQuantity;
-
-    @TableField(exist = false)
-    @Schema(description = "閫�璐ф暟閲�")
-    private BigDecimal returnQuantity;
-
-    @TableField(exist = false)
-    @Schema(description = "閿�鍞彂璐ф暟閲�")
-    private BigDecimal shippedQuantity;
-
-    @TableField(exist = false)
-    @Schema(description = "宸插鏍稿叆搴撴暟閲�")
-    private BigDecimal approvedStockInNum;
-
-    @TableField(exist = false)
-    @Schema(description = "瀹℃壒涓暟閲�")
-    private BigDecimal pendingApprovalQuantity;
 }
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesQuotation.java b/src/main/java/com/ruoyi/sales/pojo/SalesQuotation.java
index d8a97a6..b72b3af 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesQuotation.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesQuotation.java
@@ -52,6 +52,7 @@
     @ApiModelProperty(value = "澶囨敞")
     private String remark;
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
     private LocalDateTime createTime;
 
     @ApiModelProperty(value = "淇敼鏃堕棿")
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesQuotationProduct.java b/src/main/java/com/ruoyi/sales/pojo/SalesQuotationProduct.java
index 2e55e79..c5a1856 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesQuotationProduct.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesQuotationProduct.java
@@ -4,6 +4,7 @@
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
 @Data
@@ -27,11 +28,11 @@
     @Schema(description = "鍗曚綅")
     private String unit;
     @Schema(description = "鍗曚环")
-    private Double unitPrice;
+    private BigDecimal unitPrice;
     @Schema(description = "鏁伴噺")
     private Integer quantity;
     @Schema(description = "閲戦")
-    private Double amount;
+    private BigDecimal amount;
     @Schema(description = "鍒涘缓鏃堕棿")
     @TableField(fill = FieldFill.INSERT)
     private LocalDateTime createTime;
diff --git a/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java b/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
index 539e67c..bffc3d4 100644
--- a/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
+++ b/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
@@ -18,6 +18,7 @@
 import jakarta.validation.constraints.NotNull;
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 閿�鍞彴璐ervice鎺ュ彛
@@ -55,4 +56,6 @@
     List<LossProductModelDto> getSalesLedgerWithProductsLoss(Long salesLedgerId);
 
     IPage<SalesLedgerDto> listSalesLedger(SalesLedgerDto salesLedgerDto, Page page);
+
+    Map<String, Object> getPrintData(Long id);
 }
diff --git a/src/main/java/com/ruoyi/sales/service/ShippingInfoService.java b/src/main/java/com/ruoyi/sales/service/ShippingInfoService.java
index 12ed935..aa7bad5 100644
--- a/src/main/java/com/ruoyi/sales/service/ShippingInfoService.java
+++ b/src/main/java/com/ruoyi/sales/service/ShippingInfoService.java
@@ -31,6 +31,4 @@
     List<ShippingProductDetailDto> getDetail(Long id);
 
     ShippingApproveDto getDateilByShippingNo(String shippingNo);
-
-    boolean addReq(ShippingInfoDto req);
 }
diff --git a/src/main/java/com/ruoyi/sales/service/impl/MetricStatisticsServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/MetricStatisticsServiceImpl.java
index 1ff7fa1..2ceec4e 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/MetricStatisticsServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/MetricStatisticsServiceImpl.java
@@ -34,22 +34,57 @@
 
     public AjaxResult total() {
         List<SalesLedger> salesLedgers = salesLedgerMapper.selectList(null);
-        if(CollectionUtils.isEmpty(salesLedgers)) return AjaxResult.success(salesLedgers);
+        if (CollectionUtils.isEmpty(salesLedgers)) {
+            return AjaxResult.success(salesLedgers);
+        }
+
         Map<String, Object> map = new HashMap<>();
-        // 閿�鍞
-        map.put("contractAmountTotal", salesLedgers.stream().map(SalesLedger::getContractAmount).reduce(BigDecimal.ZERO, BigDecimal::add));
-        // 璁㈠崟鏁伴噺
-        map.put("total", new BigDecimal(salesLedgers.size()));
-        // 鍙戣揣鐜�
-        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>()
+        //  閿�鍞
+        BigDecimal contractAmountTotal = salesLedgers.stream()
+                .map(SalesLedger::getContractAmount)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        map.put("contractAmountTotal", contractAmountTotal);
+
+        //  璁㈠崟鏁伴噺
+        int totalOrders = salesLedgers.size();
+        map.put("total", new BigDecimal(totalOrders));
+        map.put("shipRate", "0.00%");
+
+        //  浜у搧閿�鍞暟閲�
+        List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>()
                 .eq(SalesLedgerProduct::getType, 1));
-        map.put("shipRate", "0%");
-        if(CollectionUtils.isEmpty(salesLedgerProducts)) return AjaxResult.success(map);
-        // 鍙戣揣鏁伴噺
-        long count = shippingInfoMapper.selectCount(new LambdaQueryWrapper<ShippingInfo>()
-                .in(ShippingInfo::getSalesLedgerProductId, salesLedgerProducts.stream().map(SalesLedgerProduct::getId).collect(Collectors.toList()))
-                .eq(ShippingInfo::getStatus,"宸插彂璐�"));
-        map.put("shipRate", String.format("%.2f", count * 100.0 / salesLedgerProducts.size()) + "%");
+        BigDecimal productQuantityTotal = CollectionUtils.isEmpty(products) ? BigDecimal.ZERO :
+                products.stream()
+                        .map(SalesLedgerProduct::getQuantity)
+                        .filter(Objects::nonNull)
+                        .reduce(BigDecimal.ZERO, BigDecimal::add);
+        map.put("productQuantityTotal", productQuantityTotal);
+
+        if (CollectionUtils.isEmpty(products)) {
+            return AjaxResult.success(map);
+        }
+
+        Map<Long, Long> productIdToLedgerIdMap = products.stream()
+                .filter(p -> p.getId() != null && p.getSalesLedgerId() != null)
+                .collect(Collectors.toMap(SalesLedgerProduct::getId, SalesLedgerProduct::getSalesLedgerId, (k1, k2) -> k1));
+
+        List<ShippingInfo> shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>()
+                .eq(ShippingInfo::getStatus, "瀹℃牳閫氳繃"));
+
+        long shippedOrderCount = shippingInfos.stream()
+                .filter(info -> productIdToLedgerIdMap.containsKey(info.getSalesLedgerProductId()))
+                .map(info -> {
+                    if (info.getSalesLedgerId() != null) {
+                        return info.getSalesLedgerId();
+                    }
+                    return productIdToLedgerIdMap.get(info.getSalesLedgerProductId());
+                })
+                .filter(Objects::nonNull)
+                .distinct()
+                .count();
+
+        map.put("shipRate", String.format("%.2f", shippedOrderCount * 100.0 / totalOrders) + "%");
         return AjaxResult.success(map);
     }
 
@@ -88,6 +123,7 @@
         List<String> dateList = new ArrayList<>();
         List<BigDecimal> orderCountList = new ArrayList<>();
         List<BigDecimal> salesAmountList = new ArrayList<>();
+        List<BigDecimal> productQuantityList = new ArrayList<>();
         List<BigDecimal> shippingRateList = new ArrayList<>();
 
         Calendar tempCalendar = Calendar.getInstance();
@@ -108,10 +144,12 @@
             if (dto != null) {
                 orderCountList.add(new BigDecimal(dto.getOrderCount()));
                 salesAmountList.add(dto.getSalesAmount() != null ? dto.getSalesAmount() : BigDecimal.ZERO);
+                productQuantityList.add(dto.getProductQuantity() != null ? dto.getProductQuantity() : BigDecimal.ZERO);
                 shippingRateList.add(new BigDecimal(String.valueOf(dto.getShipRate())));
             } else {
                 orderCountList.add(BigDecimal.ZERO);
                 salesAmountList.add(BigDecimal.ZERO);
+                productQuantityList.add(BigDecimal.ZERO);
                 shippingRateList.add(BigDecimal.ZERO);
             }
 
@@ -122,6 +160,7 @@
         map.put("dateList", dateList);
         map.put("orderCountList", orderCountList);
         map.put("salesAmountList", salesAmountList);
+        map.put("productQuantityList", productQuantityList);
         map.put("shippingRateList", shippingRateList);
         return AjaxResult.success(map);
     }
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
index 171f5ae..28ce78a 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.AmountUtils;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.production.mapper.*;
@@ -25,7 +26,6 @@
 import com.ruoyi.technology.mapper.TechnologyBomStructureMapper;
 import com.ruoyi.technology.mapper.TechnologyRoutingMapper;
 import com.ruoyi.technology.pojo.TechnologyRouting;
-import org.apache.commons.lang3.BooleanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -34,6 +34,7 @@
 import java.lang.reflect.Field;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.Arrays;
@@ -89,7 +90,9 @@
 
     @Override
     public SalesLedgerProduct selectSalesLedgerProductById(Long id) {
-        return salesLedgerProductMapper.selectById(id);
+        SalesLedgerProduct product = salesLedgerProductMapper.selectById(id);
+        AmountUtils.normalizeSalesLedgerProduct(product);
+        return product;
     }
 
     @Override
@@ -97,29 +100,17 @@
         List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectSalesLedgerProductList(salesLedgerProduct);
         if(!CollectionUtils.isEmpty(salesLedgerProducts)){
             salesLedgerProducts.forEach(item -> {
-                // 鍙戣揣淇℃伅锛堝彇鏈�鏂颁竴鏉★紝鍙煡璇㈠鏍搁�氳繃鎴栧凡鍙戣揣鐨勮褰曪級
-                ShippingInfo latestShippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>()
+                AmountUtils.normalizeSalesLedgerProduct(item);
+                // 鍙戣揣淇℃伅
+                ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>()
                         .eq(ShippingInfo::getSalesLedgerProductId, item.getId())
-                        .in(ShippingInfo::getStatus, "瀹℃牳閫氳繃", "宸插彂璐�")
                         .orderByDesc(ShippingInfo::getCreateTime)
                         .last("limit 1"));
-                if(latestShippingInfo != null){
-                    item.setShippingDate(latestShippingInfo.getShippingDate());
-                    item.setExpressCompany(latestShippingInfo.getExpressCompany());
-                    item.setExpressNumber(latestShippingInfo.getExpressNumber());
-                }
-                // 杞︾墝鍙凤細鍙栨墍鏈夊鏍搁�氳繃鎴栧凡鍙戣揣璁板綍鐨勮溅鐗屽彿锛岄�楀彿鎷兼帴
-                List<ShippingInfo> allShippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>()
-                        .eq(ShippingInfo::getSalesLedgerProductId, item.getId())
-                        .in(ShippingInfo::getStatus, "瀹℃牳閫氳繃", "宸插彂璐�")
-                        .orderByAsc(ShippingInfo::getCreateTime));
-                if(!CollectionUtils.isEmpty(allShippingInfos)){
-                    String carNumbers = allShippingInfos.stream()
-                            .map(ShippingInfo::getShippingCarNumber)
-                            .filter(carNo -> carNo != null && !carNo.trim().isEmpty())
-                            .distinct()
-                            .collect(Collectors.joining(","));
-                    item.setShippingCarNumber(carNumbers);
+                if(shippingInfo != null){
+                    item.setShippingDate(shippingInfo.getShippingDate());
+                    item.setShippingCarNumber(shippingInfo.getShippingCarNumber());
+                    item.setExpressCompany(shippingInfo.getExpressCompany());
+                    item.setExpressNumber(shippingInfo.getExpressNumber());
                 }
             });
         }
@@ -177,6 +168,7 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public int addOrUpdateSalesLedgerProduct(SalesLedgerProduct salesLedgerProduct) {
+        AmountUtils.normalizeSalesLedgerProduct(salesLedgerProduct);
 
         int result;
         Long salesLedgerId = salesLedgerProduct.getSalesLedgerId();
@@ -228,22 +220,20 @@
      */
     public void addProductionData(SalesLedgerProduct salesLedgerProduct) {
         //鍏堝垽鏂浜у搧鏄惁闇�瑕佺敓浜�
-        if (!BooleanUtils.isTrue(salesLedgerProduct.getIsProduction())) {
-            return;
+        if (Boolean.TRUE.equals(salesLedgerProduct.getIsProduction())) {
+            SalesLedger salesLedger = salesLedgerMapper.selectById(salesLedgerProduct.getSalesLedgerId());
+            ProductionPlan productionPlan = new ProductionPlan();
+            productionPlan.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId());
+            productionPlan.setSalesLedgerProductId(salesLedgerProduct.getId());
+            productionPlan.setMpsNo(generateNextPlanNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"))));
+            productionPlan.setProductModelId(salesLedgerProduct.getProductModelId());
+            productionPlan.setQtyRequired(salesLedgerProduct.getQuantity());
+            productionPlan.setSource("閿�鍞�");
+            productionPlan.setStatus(0);
+            productionPlan.setRequiredDate(salesLedger.getDeliveryDate());//闇�姹傛棩鏈�=浜よ揣鏃ユ湡
+            productionPlan.setPromisedDeliveryDate(salesLedger.getDeliveryDate());//鎵胯鏃ユ湡=浜よ揣鏃ユ湡
+            productionPlanMapper.insert(productionPlan);
         }
-        SalesLedger salesLedger = salesLedgerMapper.selectById(salesLedgerProduct.getSalesLedgerId());
-        ProductionPlan productionPlan = new ProductionPlan();
-        productionPlan.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId());
-        productionPlan.setSalesLedgerProductId(salesLedgerProduct.getId());
-        productionPlan.setMpsNo(generateNextPlanNo(com.ruoyi.common.utils.DateUtils.toLocalDate(salesLedger.getEntryDate())
-                .format(DateTimeFormatter.ofPattern("yyyyMMdd"))));
-        productionPlan.setProductModelId(salesLedgerProduct.getProductModelId());
-        productionPlan.setQtyRequired(salesLedgerProduct.getQuantity());
-        productionPlan.setSource("閿�鍞�");
-        productionPlan.setStatus(0);
-        productionPlan.setRequiredDate(salesLedger.getDeliveryDate());//闇�姹傛棩鏈�=浜よ揣鏃ユ湡
-        productionPlan.setPromisedDeliveryDate(salesLedger.getDeliveryDate());//鎵胯鏃ユ湡=浜よ揣鏃ユ湡
-        productionPlanMapper.insert(productionPlan);
 
     }
 
@@ -295,7 +285,7 @@
 
             Field amountField = mainEntityClass.getDeclaredField("contractAmount");
             amountField.setAccessible(true);
-            amountField.set(entity, totalAmount);
+            amountField.set(entity, AmountUtils.scaleAmount(totalAmount));
 
             mainMapper.updateById(entity);
         } catch (Exception e) {
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 00e913f..b52b8bf 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -22,6 +22,7 @@
 import com.ruoyi.common.enums.FileNameType;
 import com.ruoyi.common.enums.SaleEnum;
 import com.ruoyi.common.exception.base.BaseException;
+import com.ruoyi.common.utils.AmountUtils;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.EnumUtil;
 import com.ruoyi.common.utils.SecurityUtils;
@@ -38,6 +39,8 @@
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.mapper.SysDeptMapper;
 import com.ruoyi.project.system.mapper.SysUserMapper;
+import com.ruoyi.purchase.dto.SimpleReturnOrderGroupDto;
+import com.ruoyi.purchase.mapper.PurchaseReturnOrderProductsMapper;
 import com.ruoyi.quality.mapper.QualityInspectMapper;
 import com.ruoyi.sales.dto.*;
 import com.ruoyi.sales.mapper.CommonFileMapper;
@@ -61,7 +64,6 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 
 import java.io.InputStream;
 import java.lang.reflect.Field;
@@ -119,6 +121,9 @@
     @Autowired
     private ProductionProductMainService productionProductMainService;
     @Autowired
+    private PurchaseReturnOrderProductsMapper purchaseReturnOrderProductsMapper;
+    ;
+    @Autowired
     private SysUserMapper sysUserMapper;
 
     @Override
@@ -143,11 +148,17 @@
         productWrapper.eq(SalesLedgerProduct::getType, type.getCode());
         List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(productWrapper);
         if (type.equals(SaleEnum.PURCHASE)) {
+            // 鏌ヨ閫�璐т俊鎭�
+            List<Long> productIds = salesLedgerProducts.stream().map(SalesLedgerProduct::getProductModelId).collect(Collectors.toList());
+            List<SimpleReturnOrderGroupDto> groupListByProductIds = new ArrayList<>();
+            if (CollectionUtils.isNotEmpty(productIds)) {
+                groupListByProductIds = purchaseReturnOrderProductsMapper.getReturnOrderGroupListByProductIds(productIds);
+            }
+            Map<Long, BigDecimal> returnOrderGroupDtoMap = groupListByProductIds.stream().collect(Collectors.toMap(SimpleReturnOrderGroupDto::getProductModelId, SimpleReturnOrderGroupDto::getSumReturnQuantity));
             salesLedgerProducts.forEach(item -> {
-                BigDecimal returnQuantity = item.getReturnQuantity() == null ? BigDecimal.ZERO : item.getReturnQuantity();
-                item.setReturnQuantity(returnQuantity);
-                BigDecimal quantity = item.getQuantity() == null ? BigDecimal.ZERO : item.getQuantity();
-                item.setAvailableQuality(quantity.subtract(returnQuantity));
+                BigDecimal returnQuality = returnOrderGroupDtoMap.getOrDefault(item.getProductModelId(), BigDecimal.ZERO);
+                item.setReturnQuality(returnQuality);
+                item.setAvailableQuality(item.getQuantity().subtract(returnQuality));
             });
         }
         return salesLedgerProducts;
@@ -166,6 +177,7 @@
         productWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedger.getId());
         productWrapper.eq(SalesLedgerProduct::getType, 1);
         List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(productWrapper);
+        AmountUtils.normalizeSalesLedgerProducts(products);
         for (SalesLedgerProduct product : products) {
             product.setRegister(SecurityUtils.getLoginUser().getUser().getNickName());
             product.setRegisterDate(LocalDateTime.now());
@@ -175,7 +187,11 @@
                     .orderByDesc(ShippingInfo::getCreateTime)
                     .last("limit 1"));
             if (shippingInfo != null) {
+                product.setShippingCarNumber(shippingInfo.getShippingCarNumber());
+                product.setShippingDate(shippingInfo.getShippingDate());
                 product.setShippingStatus(shippingInfo.getStatus());
+                product.setExpressCompany(shippingInfo.getExpressCompany());
+                product.setExpressNumber(shippingInfo.getExpressNumber());
             }
         }
 
@@ -188,6 +204,7 @@
         // 4. 杞崲 DTO
         SalesLedgerDto resultDto = new SalesLedgerDto();
         BeanUtils.copyProperties(salesLedger, resultDto);
+        AmountUtils.normalizeContractAmount(resultDto);
         if (!products.isEmpty()) {
             resultDto.setHasChildren(true);
             resultDto.setProductData(products);
@@ -287,7 +304,7 @@
             dto.setReceiptAmount(totalIncome);
             //寮�绁ㄩ噾棰�
             List<AccountInvoiceApplication> accountInvoiceApplications = accountInvoiceApplicationMapper.selectList(new LambdaQueryWrapper<AccountInvoiceApplication>()
-                            .eq(AccountInvoiceApplication::getStatus,1)
+                    .eq(AccountInvoiceApplication::getStatus, 1)
                     .between(AccountInvoiceApplication::getApplyDate, startTime, endTime));
             BigDecimal totalInvoiceAmount = Optional.of(
                     accountInvoiceApplications.stream()
@@ -303,7 +320,11 @@
 
     @Override
     public IPage<SalesLedgerVo> selectSalesLedgerListPage(Page page, SalesLedgerDto salesLedgerDto) {
-        return salesLedgerMapper.selectSalesLedgerListPage(page, salesLedgerDto);
+        IPage<SalesLedgerVo> result = salesLedgerMapper.selectSalesLedgerListPage(page, salesLedgerDto);
+        if (!CollectionUtils.isEmpty(result.getRecords())) {
+            result.getRecords().forEach(AmountUtils::normalizeContractAmount);
+        }
+        return result;
     }
 
     @Override
@@ -320,17 +341,9 @@
             if (CollectionUtils.isEmpty(salesLedgerImportDtoList)) return AjaxResult.error("閿�鍞彴璐︽暟鎹负绌猴紒");
             List<SalesLedgerImportDto> salesLedgerProductImportDtoList = stringListMap.get("閿�鍞骇鍝佹暟鎹�");
             if (CollectionUtils.isEmpty(salesLedgerProductImportDtoList)) return AjaxResult.error("閿�鍞骇鍝佹暟鎹负绌猴紒");
-            // 瀹㈡埛鏁版嵁 - 鍙傝�� listPage 鏌ヨ绉佹捣瀹㈡埛锛坱ype = 0锛�
-            // type = 0锛堢娴峰鎴凤級鎴栬�� type = 1锛堝叕娴峰鎴凤級涓斿凡琚垎閰嶏紝骞朵笖鏄嚜宸遍鐢ㄣ�佽嚜宸卞垱寤烘垨鑰呭叡浜粰鑷繁鐨勫鎴�
-            Long loginUserId = loginUser.getUser().getUserId();
-            List<Customer> customers = customerMapper.selectList(new QueryWrapper<Customer>()
-                    .in("customer_name", salesLedgerImportDtoList.stream()
-                            .map(SalesLedgerImportDto::getCustomerName).collect(Collectors.toList()))
-                    .and(wrapper -> wrapper.eq("type", 0)
-                            .or(wrapper2 -> wrapper2.eq("type", 1).eq("is_assigned", 1)))
-                    .and(wrapper -> wrapper.eq("usage_user", loginUserId)
-                            .or(wrapper2 -> wrapper2.eq("create_user", loginUserId)
-                                    .or(wrapper3 -> wrapper3.exists("select 1 from customer_user cu where cu.customer_id = customer.id and cu.user_id = " + loginUserId)))));
+            // 瀹㈡埛鏁版嵁
+            List<Customer> customers = customerMapper.selectList(new LambdaQueryWrapper<Customer>().in(Customer::getCustomerName,
+                    salesLedgerImportDtoList.stream().map(SalesLedgerImportDto::getCustomerName).collect(Collectors.toList())));
 //            // 瑙勬牸鍨嬪彿鏁版嵁
 //            List<ProductModel> productModels = productModelMapper.selectList(new LambdaQueryWrapper<ProductModel>().in(ProductModel::getModel,
 //                    salesLedgerProductImportDtoList.stream().map(SalesLedgerImportDto::getSpecificationModel).collect(Collectors.toList())));
@@ -348,26 +361,21 @@
                 if (salesLedger1 != null) {
                     continue;
                 }
-
-                // 鍒ゆ柇涓氬姟鍛樻槸鍚﹀瓨鍦�
-                SysUser salesman = sysUserMapper.selectOne(new LambdaQueryWrapper<SysUser>()
-                        .eq(SysUser::getNickName, salesLedgerImportDto.getSalesman()));
-                if (salesman == null) {
-                    throw new RuntimeException("涓氬姟鍛�:" + salesLedgerImportDto.getSalesman() + "涓嶅瓨鍦紒");
-                }
                 SalesLedger salesLedger = new SalesLedger();
                 BeanUtils.copyProperties(salesLedgerImportDto, salesLedger);
                 salesLedger.setExecutionDate(DateUtils.toLocalDate(salesLedgerImportDto.getExecutionDate()));
                 salesLedger.setDeliveryDate(DateUtils.toLocalDate(salesLedgerImportDto.getDeliveryDate()));
                 // 閫氳繃瀹㈡埛鍚嶇О鏌ヨ瀹㈡埛ID锛屽鎴峰悎鍚屽彿
-                Optional<Customer> customerOptional = customers.stream()
+                salesLedger.setCustomerId(customers.stream()
                         .filter(customer -> customer.getCustomerName().equals(salesLedger.getCustomerName()))
-                        .findFirst();
-                if (customerOptional.isEmpty()) {
-                    throw new RuntimeException("瀹㈡埛:" + salesLedger.getCustomerName() + "涓嶅瓨鍦紒鎴栬�呴潪绉佹捣鐢ㄦ埛");
-                }
-                salesLedger.setCustomerId(customerOptional.get().getId());
-                salesLedger.setCustomerContractNo(customerOptional.get().getTaxpayerIdentificationNumber());
+                        .findFirst()
+                        .map(Customer::getId)
+                        .orElse(null));
+                salesLedger.setCustomerContractNo(customers.stream()
+                        .filter(customer -> customer.getCustomerName().equals(salesLedger.getCustomerName()))
+                        .findFirst()
+                        .map(Customer::getTaxpayerIdentificationNumber)
+                        .orElse(null));
                 Long aLong = sysUsers.stream()
                         .filter(sysUser -> sysUser.getNickName().equals(salesLedger.getEntryPerson()))
                         .findFirst()
@@ -385,7 +393,6 @@
                 salesLedger.setContractAmount(salesLedgerProductImportDtos.stream()
                         .map(SalesLedgerProductImportDto::getTaxInclusiveTotalPrice)
                         .reduce(BigDecimal.ZERO, BigDecimal::add));
-                salesLedger.setNetContractAmount(salesLedger.getContractAmount());
                 salesLedgerMapper.insert(salesLedger);
 
 
@@ -394,18 +401,21 @@
                     BeanUtils.copyProperties(salesLedgerProductImportDto, salesLedgerProduct);
                     salesLedgerProduct.setSalesLedgerId(salesLedger.getId());
                     salesLedgerProduct.setType(1);
+                    AmountUtils.normalizeSalesLedgerProduct(salesLedgerProduct);
                     // 璁$畻涓嶅惈绋庢�讳环
-                    salesLedgerProduct.setTaxExclusiveTotalPrice(salesLedgerProduct.getTaxInclusiveTotalPrice().divide(new BigDecimal(1).add(salesLedgerProduct.getTaxRate().divide(new BigDecimal(100))), 2, RoundingMode.HALF_UP));
-                    // 鏍¢獙浜у搧瑙勬牸鏄惁瀛樺湪
-                    Optional<Map<String, Object>> productModelOptional = list.stream()
+                    salesLedgerProduct.setTaxExclusiveTotalPrice(
+                            AmountUtils.calcTaxExclusiveTotalPrice(
+                                    salesLedgerProduct.getTaxInclusiveTotalPrice(),
+                                    salesLedgerProduct.getTaxRate()
+                            )
+                    );
+                    list.stream()
                             .filter(map -> Objects.equals(map.get("productName"), salesLedgerProduct.getProductCategory()) && Objects.equals(map.get("model"), salesLedgerProduct.getSpecificationModel()))
-                            .findFirst();
-                    if (productModelOptional.isEmpty()) {
-                        throw new RuntimeException("浜у搧澶х被:" + salesLedgerProduct.getProductCategory() + ",瑙勬牸鍨嬪彿:" + salesLedgerProduct.getSpecificationModel() + "涓嶅瓨鍦紒");
-                    }
-                    Map<String, Object> productModelMap = productModelOptional.get();
-                    salesLedgerProduct.setProductModelId(Long.parseLong(productModelMap.get("modelId").toString()));
-                    salesLedgerProduct.setProductId(Long.parseLong(productModelMap.get("id").toString()));
+                            .findFirst()
+                            .ifPresent(map -> {
+                                salesLedgerProduct.setProductModelId(Long.parseLong(map.get("modelId").toString()));
+                                salesLedgerProduct.setProductId(Long.parseLong(map.get("id").toString()));
+                            });
 //                    salesLedgerProduct.setProductId(productList.stream()
 //                            .filter(product -> product.getProductName().equals(salesLedgerProduct.getProductCategory()))
 //                            .findFirst()
@@ -452,21 +462,23 @@
             productWrapper.eq(SalesLedgerProduct::getType, 1);
             List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(productWrapper);
             for (SalesLedgerProduct product : products) {
-               product.setRegister(SecurityUtils.getLoginUser().getUser().getNickName());
+                product.setRegister(SecurityUtils.getLoginUser().getUser().getNickName());
                 product.setRegisterDate(LocalDateTime.now());
                 // 鍙戣揣淇℃伅
                 ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>()
                         .eq(ShippingInfo::getSalesLedgerProductId, product.getId())
                         .orderByDesc(ShippingInfo::getCreateTime)
                         .last("limit 1"));
-                product.setShippingCarNumber(shippingInfo.getShippingCarNumber());
-                product.setShippingDate(shippingInfo.getShippingDate());
                 if (shippingInfo != null) {
+                    product.setShippingCarNumber(shippingInfo.getShippingCarNumber());
+                    product.setShippingDate(shippingInfo.getShippingDate());
                     product.setShippingStatus(shippingInfo.getStatus());
+                    product.setExpressCompany(shippingInfo.getExpressCompany());
+                    product.setExpressNumber(shippingInfo.getExpressNumber());
                 }
             }
             // 杩囨护鍙繚鐣欏彂璐ц褰�
-            products = products.stream().filter(product -> "宸插彂璐�".equals(product.getShippingStatus())).collect(Collectors.toList());
+            products = products.stream().filter(product -> "瀹℃牳閫氳繃".equals(product.getShippingStatus())).collect(Collectors.toList());
             if (!products.isEmpty()) {
                 salesLedger.setHasChildren(true);
                 salesLedger.setProductData(products);
@@ -511,6 +523,7 @@
         // 鍒犻櫎閿�鍞鐞嗘暟鎹�
         LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.in(SalesLedgerProduct::getSalesLedgerId, idList)
+                .eq(SalesLedgerProduct::getType, 1)
                 .select(SalesLedgerProduct::getId);
 
         List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(queryWrapper);
@@ -559,17 +572,14 @@
 
         // 2. DTO杞珽ntity
         SalesLedger salesLedger = convertToEntity(salesLedgerDto);
+        AmountUtils.normalizeContractAmount(salesLedger);
         salesLedger.setCustomerName(customer.getCustomerName());
         salesLedger.setTenantId(customer.getTenantId());
-        // 褰曞叆浜猴細濡傛灉鏈紶鍒欎娇鐢ㄥ綋鍓嶇櫥褰曠敤鎴�
-        if (StringUtils.isEmpty(salesLedger.getEntryPerson())) {
-            salesLedger.setEntryPerson(String.valueOf(SecurityUtils.getUserId()));
-        }
         // 3. 鏂板鎴栨洿鏂颁富琛�
         if (salesLedger.getId() == null) {
             String contractNo = salesLedger.getSalesContractNo();
             if (StringUtils.isEmpty(contractNo)) {
-                contractNo = generateSalesContractNo(salesLedgerDto.getEntryDate());
+                contractNo = generateSalesContractNo();
             }
             salesLedger.setSalesContractNo(contractNo);
             salesLedgerMapper.insert(salesLedger);
@@ -581,6 +591,7 @@
         // 4. 澶勭悊瀛愯〃鏁版嵁
         List<SalesLedgerProduct> productList = salesLedgerDto.getProductData();
         if (productList != null && !productList.isEmpty()) {
+            AmountUtils.normalizeSalesLedgerProducts(productList);
             handleSalesLedgerProducts(salesLedger.getId(), productList, EnumUtil.fromCode(SaleEnum.class, salesLedgerDto.getType()));
             updateMainContractAmount(
                     salesLedger.getId(),
@@ -591,18 +602,7 @@
             );
         }
 
-        // 5. 鍏滃簳锛氱‘淇濆疄闄呭悎鍚岄噾棰濇湁鍒濆鍊肩瓑浜庡悎鍚岄噾棰�
-        if (salesLedger.getNetContractAmount() == null) {
-            SalesLedger dbLedger = salesLedgerMapper.selectById(salesLedger.getId());
-            if (dbLedger != null && dbLedger.getNetContractAmount() == null && dbLedger.getContractAmount() != null) {
-                SalesLedger updateEntity = new SalesLedger();
-                updateEntity.setId(salesLedger.getId());
-                updateEntity.setNetContractAmount(dbLedger.getContractAmount());
-                salesLedgerMapper.updateById(updateEntity);
-            }
-        }
-
-        // 6. 淇濆瓨閿�鍞彴璐﹂檮浠�
+        // 5. 淇濆瓨閿�鍞彴璐﹂檮浠�
         fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.SALES_LEDGER, salesLedger.getId(), salesLedgerDto.getStorageBlobDTOs());
 
         return 1;
@@ -621,6 +621,7 @@
         // 鎵ц鏇存柊鎿嶄綔
         if (!updateList.isEmpty()) {
             for (SalesLedgerProduct product : updateList) {
+                AmountUtils.normalizeSalesLedgerProduct(product);
                 product.setType(type.getCode());
                 salesLedgerProductMapper.updateById(product);
             }
@@ -628,6 +629,7 @@
         // 鎵ц鎻掑叆鎿嶄綔
         if (!insertList.isEmpty()) {
             for (SalesLedgerProduct salesLedgerProduct : insertList) {
+                AmountUtils.normalizeSalesLedgerProduct(salesLedgerProduct);
                 salesLedgerProduct.setType(type.getCode());
                 salesLedgerProductMapper.insert(salesLedgerProduct);
                 // 娣诲姞鐢熶骇鏁版嵁
@@ -643,8 +645,8 @@
     }
 
     @Transactional(readOnly = true)
-    public String generateSalesContractNo(Date entryDate) {
-        LocalDate currentDate = entryDate != null ? DateUtils.toLocalDate(entryDate) : LocalDate.now();
+    public String generateSalesContractNo() {
+        LocalDate currentDate = LocalDate.now();
         String datePart = currentDate.format(DateTimeFormatter.BASIC_ISO_DATE);
         String lockKey = LOCK_PREFIX + datePart;
         String lockValue = Thread.currentThread().getId() + "-" + System.nanoTime(); // 鍞竴鏍囪瘑閿佹寔鏈夎��
@@ -672,14 +674,15 @@
             }
 
             // 2. 鏌ヨ褰撳ぉ/鍏徃宸插瓨鍦ㄧ殑搴忓垪鍙凤紙涓庡師閫昏緫涓�鑷达級
-            Long tenantId = SecurityUtils.getLoginUser().getTenantId();
-            if (null != tenantId) {
-                //鑾峰彇鍏徃缂栧彿
-                SysDept sysDept = sysDeptMapper.selectDeptById(tenantId.longValue());
-                if (!ObjectUtils.isEmpty(sysDept)) {
-                    datePart = (StringUtils.isEmpty(sysDept.getDeptNick()) ? "" : sysDept.getDeptNick()) + datePart;
-                }
-            }
+//            Long tenantId = SecurityUtils.getLoginUser().getTenantId();
+//            if (null != tenantId) {
+            //鑾峰彇鍏徃缂栧彿
+//                SysDept sysDept = sysDeptMapper.selectDeptById(tenantId.longValue());
+//                if (!ObjectUtils.isEmpty(sysDept)) {
+//                    datePart = (StringUtils.isEmpty(sysDept.getDeptNick()) ? "" : sysDept.getDeptNick()) + datePart;
+//                }
+//            }
+            datePart = "D" + datePart;
             List<Integer> existingSequences = salesLedgerMapper.selectSequencesByDate(datePart);
             int nextSequence = findFirstMissingSequence(existingSequences);
 
@@ -738,16 +741,7 @@
 
             Field amountField = mainEntityClass.getDeclaredField("contractAmount");
             amountField.setAccessible(true);
-            amountField.set(entity, totalAmount);
-
-            // 瀹為檯鍚堝悓閲戦鍒濆鍊肩瓑浜庡悎鍚岄噾棰�
-            try {
-                Field netAmountField = mainEntityClass.getDeclaredField("netContractAmount");
-                netAmountField.setAccessible(true);
-                netAmountField.set(entity, totalAmount);
-            } catch (NoSuchFieldException ignored) {
-                // 瀛愮被鍙兘娌℃湁璇ュ瓧娈碉紝蹇界暐
-            }
+            amountField.set(entity, AmountUtils.scaleAmount(totalAmount));
 
             mainMapper.updateById(entity);
         } catch (Exception e) {
@@ -784,4 +778,19 @@
             return totalAmount;
         }
     }
+
+    @Override
+    public Map<String, Object> getPrintData(Long id) {
+        SalesLedgerDto dto = new SalesLedgerDto();
+        dto.setId(id);
+        SalesLedgerDto ledger = getSalesLedgerWithProducts(dto);
+        if (ledger == null) {
+            return null;
+        }
+        SysDept dept = sysDeptMapper.selectDeptById(100L);
+        Map<String, Object> result = new HashMap<>();
+        result.put("companyName", dept != null ? dept.getDeptName() : "");
+        result.put("ledger", ledger);
+        return result;
+    }
 }
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java
index 37d7261..e847384 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java
@@ -7,17 +7,14 @@
 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.approve.bean.dto.ApprovalInstanceDto;
-import com.ruoyi.approve.bean.vo.ApproveGetAndUpdateVo;
-import com.ruoyi.approve.mapper.ApprovalTemplateMapper;
-import com.ruoyi.approve.pojo.ApprovalInstance;
-import com.ruoyi.approve.pojo.ApprovalTemplate;
 import com.ruoyi.approve.pojo.ApproveProcess;
-import com.ruoyi.approve.service.ApprovalInstanceService;
 import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl;
+import com.ruoyi.approve.bean.vo.ApproveGetAndUpdateVo;
+import com.ruoyi.approve.bean.vo.ApproveProcessVO;
 import com.ruoyi.basic.mapper.CustomerMapper;
 import com.ruoyi.basic.pojo.Customer;
 import com.ruoyi.common.enums.IsDeleteEnum;
+import com.ruoyi.common.utils.AmountUtils;
 import com.ruoyi.common.utils.OrderUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
@@ -33,8 +30,9 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.time.LocalDateTime;
-import java.util.*;
+import java.time.LocalDate;
+import java.util.Collections;
+import java.util.List;
 import java.util.stream.Collectors;
 
 @Service
@@ -47,8 +45,6 @@
 
     private final ApproveProcessServiceImpl approveProcessService;
     private final CustomerMapper customerMapper;
-    private final ApprovalTemplateMapper approvalTemplateMapper;
-    private final ApprovalInstanceService approvalInstanceService;
 
     @Override
     public IPage<SalesQuotationDto> listPage(Page page, SalesQuotationDto salesQuotationDto) {
@@ -56,31 +52,34 @@
         if(CollectionUtils.isEmpty(salesQuotationDtoIPage.getRecords())){
             return salesQuotationDtoIPage;
         }
-
-        // 鎵归噺鏌ヨ浜у搧锛岄伩鍏� N+1 闂
-        List<Long> quotationIds = salesQuotationDtoIPage.getRecords().stream()
-                .map(SalesQuotationDto::getId)
-                .filter(Objects::nonNull)
-                .collect(Collectors.toList());
-
-        if (!quotationIds.isEmpty()) {
-            List<SalesQuotationProduct> allProducts = salesQuotationProductMapper.selectList(
-                    new LambdaQueryWrapper<SalesQuotationProduct>()
-                            .in(SalesQuotationProduct::getSalesQuotationId, quotationIds)
-            );
-
-            Map<Long, List<SalesQuotationProduct>> productMap = allProducts.stream()
-                    .collect(Collectors.groupingBy(SalesQuotationProduct::getSalesQuotationId));
-
-            salesQuotationDtoIPage.getRecords().forEach(record ->
-                    record.setProducts(productMap.getOrDefault(record.getId(), new ArrayList<>()))
-            );
-        }
+        salesQuotationDtoIPage.getRecords().forEach(record -> {
+            record.setTotalAmount(AmountUtils.scaleAmount(record.getTotalAmount()));
+            List<SalesQuotationProduct> products = salesQuotationProductMapper.selectBySalesQuotationId(record.getId());
+            if (!CollectionUtils.isEmpty(products)) {
+                products.forEach(product -> {
+                    product.setUnitPrice(AmountUtils.scaleAmount(product.getUnitPrice()));
+                    product.setAmount(AmountUtils.scaleAmount(product.getAmount()));
+                });
+            }
+            record.setProducts(products);
+        });
         return salesQuotationDtoIPage;
+    }
+
+    private void normalizeAmounts(SalesQuotationDto salesQuotationDto) {
+        salesQuotationDto.setTotalAmount(AmountUtils.scaleAmount(salesQuotationDto.getTotalAmount()));
+        if (CollectionUtils.isEmpty(salesQuotationDto.getProducts())) {
+            return;
+        }
+        salesQuotationDto.getProducts().forEach(product -> {
+            product.setUnitPrice(AmountUtils.scaleAmount(product.getUnitPrice()));
+            product.setAmount(AmountUtils.scaleAmount(product.getAmount()));
+        });
     }
 
     @Override
     public boolean add(SalesQuotationDto salesQuotationDto) {
+        normalizeAmounts(salesQuotationDto);
         LoginUser loginUser = SecurityUtils.getLoginUser();
         SalesQuotation salesQuotation = new SalesQuotation();
         BeanUtils.copyProperties(salesQuotationDto, salesQuotation);
@@ -89,7 +88,7 @@
         if (ObjectUtils.isNotEmpty(customer))  {
             salesQuotation.setCustomer(customer.getCustomerName());
         }
-        String quotationNo = OrderUtils.countTodayByCreateTime(salesQuotationMapper, "QT","quotation_no", salesQuotationDto.getCreateTime() != null ? salesQuotationDto.getCreateTime() : LocalDateTime.now());
+        String quotationNo = OrderUtils.countTodayByCreateTime(salesQuotationMapper, "QT","quotation_no");
         salesQuotation.setQuotationNo(quotationNo);
         salesQuotation.setStatus("寰呭鎵�");
         salesQuotationMapper.insert(salesQuotation);
@@ -104,36 +103,25 @@
         }).collect(Collectors.toList());
         salesQuotationProductService.saveBatch(products);
         // 鎶ヤ环瀹℃壒
-        ApprovalTemplate approvalTemplate = approvalTemplateMapper.selectOne(
-                new LambdaQueryWrapper<ApprovalTemplate>()
-                        .eq(ApprovalTemplate::getBusinessType, 6L)
-                        .eq(ApprovalTemplate::getDeleted, 0)
-                        .orderByDesc(ApprovalTemplate::getId)
-                        .last("LIMIT 1")
-        );
-        if (approvalTemplate == null) {
-            throw new RuntimeException("璇峰厛閰嶇疆鎶ヤ环瀹℃壒妯℃澘");
-        }
-        ApprovalInstanceDto approvalInstance = new ApprovalInstanceDto();
-        approvalInstance.setTemplateId(approvalTemplate.getId());
-        approvalInstance.setTemplateName(approvalTemplate.getTemplateName());
-        approvalInstance.setBusinessId(salesQuotation.getId());
-        approvalInstance.setBusinessType(6L);
-        approvalInstance.setCurrentLevel(1);
-        approvalInstance.setTitle(quotationNo+"瀹℃壒");
-        approvalInstance.setApplicantId(loginUser.getUserId());
-        approvalInstance.setApplicantName(loginUser.getNickName());
-        approvalInstance.setApplyTime(LocalDateTime.now());
+        ApproveProcessVO approveProcessVO = new ApproveProcessVO();
+        approveProcessVO.setApproveType(6);
+        approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId());
+        approveProcessVO.setApproveReason(quotationNo);
+        approveProcessVO.setApproveUserIds(salesQuotationDto.getApproveUserIds());
+        approveProcessVO.setApproveUser(loginUser.getUserId());
+        approveProcessVO.setApproveTime(LocalDate.now().toString());
+        approveProcessVO.setPrice(salesQuotationDto.getTotalAmount());
         try {
-            approvalInstanceService.add(approvalInstance);
-        } catch (Exception e) {
-            log.error("SalesQuotationServiceImpl approve error for quotationNo: {}", e);
-            throw new RuntimeException("瀹℃壒澶辫触: " + e.getMessage(), e);
+            approveProcessService.addApprove(approveProcessVO);
+        }catch (Exception e){
+            log.error("SalesQuotationServiceImpl error:{}", e);
+            throw                                new RuntimeException("瀹℃壒澶辫触");
         }
         return true;
     }
     @Override
     public boolean edit(SalesQuotationDto salesQuotationDto) {
+        normalizeAmounts(salesQuotationDto);
         SalesQuotation salesQuotation = new SalesQuotation();
         BeanUtils.copyProperties(salesQuotationDto, salesQuotation);
         ApproveGetAndUpdateVo vo = new ApproveGetAndUpdateVo();
@@ -157,35 +145,10 @@
 
         salesQuotationProductService.saveBatch(products);
         // 淇敼鎶ヤ环瀹℃壒
-        // 鍏堢粨鏉熶箣鍓嶆湭缁撴潫鐨勬姤浠峰鎵�
-        approvalInstanceService.lambdaUpdate().set(ApprovalInstance::getStatus,"REJECTED").eq(ApprovalInstance::getBusinessId,salesQuotation.getId()).eq(ApprovalInstance::getBusinessType,6L).update();
-
-        ApprovalTemplate approvalTemplate = approvalTemplateMapper.selectOne(
-                new LambdaQueryWrapper<ApprovalTemplate>()
-                        .eq(ApprovalTemplate::getBusinessType, 6L)
-                        .eq(ApprovalTemplate::getDeleted, 0)
-                        .orderByDesc(ApprovalTemplate::getId)
-                        .last("LIMIT 1")
-        );
-        if (approvalTemplate == null) {
-            throw new RuntimeException("璇峰厛閰嶇疆鎶ヤ环瀹℃壒妯℃澘");
-        }
-        ApprovalInstanceDto approvalInstance = new ApprovalInstanceDto();
-        approvalInstance.setTemplateId(approvalTemplate.getId());
-        approvalInstance.setTemplateName(approvalTemplate.getTemplateName());
-        approvalInstance.setBusinessId(salesQuotation.getId());
-        approvalInstance.setBusinessType(6L);
-        approvalInstance.setCurrentLevel(1);
-        approvalInstance.setTitle(salesQuotation.getQuotationNo()+"瀹℃壒");
-        approvalInstance.setApplicantId(SecurityUtils.getUserId());
-        approvalInstance.setApplicantName(SecurityUtils.getLoginUser().getNickName());
-        approvalInstance.setApplyTime(LocalDateTime.now());
-        try {
-            approvalInstanceService.add(approvalInstance);
-        } catch (Exception e) {
-            log.error("SalesQuotationServiceImpl approve error for quotationNo: {}", e);
-            throw new RuntimeException("瀹℃壒澶辫触: " + e.getMessage(), e);
-        }
+        vo.setApproveUserIds(salesQuotationDto.getApproveUserIds());
+        vo.setApproveType(6);
+        vo.setApproveReason(salesQuotationDto.getQuotationNo());
+        approveProcessService.updateApproveUser(vo);
         return true;
     }
     @Override
@@ -194,31 +157,13 @@
         if(salesQuotation==null) return false;
         salesQuotationMapper.deleteById(id);
         salesQuotationProductMapper.delete(new LambdaQueryWrapper<SalesQuotationProduct>().eq(SalesQuotationProduct::getSalesQuotationId, id));
-        // 鍒犻櫎璇ユ姤浠峰搴旂殑鍏ㄩ儴瀹℃壒瀹炰緥锛堝彲鑳藉瓨鍦ㄥ娆℃彁浜�/閲嶅锛�
-        List<ApprovalInstance> approvalInstances = approvalInstanceService.list(new LambdaQueryWrapper<ApprovalInstance>()
-                .eq(ApprovalInstance::getBusinessId, id)
-                .eq(ApprovalInstance::getBusinessType, 6L)
-                .eq(ApprovalInstance::getDeleted, 0));
-        if(!approvalInstances.isEmpty()){
-            approvalInstanceService.delete(
-                    approvalInstances.stream()
-                            .map(ApprovalInstance::getId)
-                            .filter(Objects::nonNull)
-                            .collect(Collectors.toList())
-            );
-        }
-        // 鍒犻櫎璇ユ姤浠峰搴旂殑鍏ㄩ儴瀹℃壒娴佺▼锛堝悓涓�鎶ヤ环鍙兘鍙嶅鍙戣捣锛�
-        List<ApproveProcess> approveProcesses = approveProcessService.list(new LambdaQueryWrapper<ApproveProcess>()
+        // 鍒犻櫎鎶ヤ环瀹℃壒
+        ApproveProcess one = approveProcessService.getOne(new LambdaQueryWrapper<ApproveProcess>()
                 .eq(ApproveProcess::getApproveType, 6)
                 .eq(ApproveProcess::getApproveDelete, IsDeleteEnum.NOT_DELETED)
                 .eq(ApproveProcess::getApproveReason, salesQuotation.getQuotationNo()));
-        if(!approveProcesses.isEmpty()){
-            approveProcessService.delByIds(
-                    approveProcesses.stream()
-                            .map(ApproveProcess::getId)
-                            .filter(Objects::nonNull)
-                            .collect(Collectors.toList())
-            );
+        if(one != null){
+            approveProcessService.delByIds(Collections.singletonList(one.getId()));
         }
         return true;
     }
diff --git a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
index be34bc0..ea38018 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
@@ -2,22 +2,17 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.approve.bean.dto.ApprovalInstanceDto;
-import com.ruoyi.approve.mapper.ApprovalTemplateMapper;
-import com.ruoyi.approve.pojo.ApprovalTemplate;
 import com.ruoyi.approve.pojo.ApproveProcess;
-import com.ruoyi.approve.service.ApprovalInstanceService;
 import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl;
 import com.ruoyi.basic.enums.ApplicationTypeEnum;
 import com.ruoyi.basic.enums.RecordTypeEnum;
 import com.ruoyi.basic.utils.FileUtil;
 import com.ruoyi.common.enums.FileNameType;
+import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
 import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
-import com.ruoyi.common.utils.OrderUtils;
-import com.ruoyi.common.utils.SecurityUtils;
-import com.ruoyi.framework.security.LoginUser;
 import com.ruoyi.procurementrecord.bean.vo.ShippingProductVo;
 import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.sales.dto.ShippingApproveDto;
@@ -29,13 +24,16 @@
 import com.ruoyi.sales.pojo.ShippingInfo;
 import com.ruoyi.sales.pojo.ShippingProductDetail;
 import com.ruoyi.sales.service.ShippingInfoService;
+import com.ruoyi.stock.pojo.StockInRecord;
+import com.ruoyi.stock.pojo.StockOutRecord;
+import com.ruoyi.stock.service.StockOutRecordService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.time.LocalDateTime;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -60,8 +58,7 @@
     private final ApproveProcessServiceImpl approveProcessService;
     private final FileUtil fileUtil;
     private final ShippingProductDetailMapper shippingProductDetailMapper;
-    private final ApprovalTemplateMapper approvalTemplateMapper;
-    private final ApprovalInstanceService approvalInstanceService;
+    private final StockOutRecordService stockOutRecordService;
 
     @Override
     public IPage<ShippingInfoDto> listPage(Page page, ShippingInfo req) {
@@ -147,6 +144,11 @@
         shippingProductDetailMapper.insert(req.getBatchNoDetailList());
         for (ShippingProductDetail shippingProductDetail : req.getBatchNoDetailList()) {
             stockUtils.substractStock(shippingProductDetail.getProductModelId(), shippingProductDetail.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId(), shippingProductDetail.getBatchNo());
+            //StockOutRecord stockOutRecord = stockOutRecordService.getOne(Wrappers.<StockOutRecord>lambdaQuery()
+            //        .eq(StockOutRecord::getRecordId, req.getId())
+            //        .eq(StockOutRecord::getRecordType, StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode())
+            //);
+            //stockOutRecordService.batchApprove(Collections.singletonList(stockOutRecord.getId()),1);
         }
         // 淇濆瓨鏂囦欢
         fileUtil.saveStorageAttachment(ApplicationTypeEnum.IMAGE, RecordTypeEnum.SHIPPING_INFO, req.getId(), req.getStorageBlobDTOs());
@@ -167,53 +169,5 @@
         List<ShippingProductDetailDto> dateilByShippingNo = shippingProductDetailMapper.getDateilByShippingNo(shippingNo);
         shippingApproveDto.setShippingProductDetailDtoList(dateilByShippingNo);
         return shippingApproveDto;
-    }
-
-    @Override
-    public boolean addReq(ShippingInfoDto req) {
-
-        // 鏍¢獙璇ヤ骇鍝佹槸鍚﹀凡鏈夊緟瀹℃牳/瀹℃牳涓殑鍙戣揣璁板綍锛岄槻姝㈤噸澶嶆彁浜�
-        Long salesLedgerProductId = req.getSalesLedgerProductId();
-        if (salesLedgerProductId != null) {
-            long pendingCount = this.count(new LambdaQueryWrapper<ShippingInfo>()
-                    .eq(ShippingInfo::getSalesLedgerProductId, salesLedgerProductId)
-                    .in(ShippingInfo::getStatus, "寰呭鏍�", "瀹℃牳涓�"));
-            if (pendingCount > 0) {
-                throw new RuntimeException("璇ヤ骇鍝佸凡鏈夊緟瀹℃牳鐨勫彂璐ц褰曪紝璇峰嬁閲嶅鎻愪氦");
-            }
-        }
-
-        LoginUser loginUser = SecurityUtils.getLoginUser();
-        String sh = OrderUtils.countTodayByCreateTime(shippingInfoMapper, "SH","shipping_no",req.getCreateTime());
-        // 鍏堜繚瀛樺彂璐у崟锛屽啀鍙戣捣瀹℃壒锛涙棤瀹℃牳浜鸿嚜鍔ㄩ�氳繃鏃堕渶瑕佹寜鍙戣揣缂栧彿鍥炲啓鍙戣揣鐘舵�併��
-        req.setShippingNo(sh);
-        req.setStatus("寰呭鏍�");
-        boolean save = this.add(req);
-        // 鍙戣揣瀹℃壒
-        ApprovalTemplate approvalTemplate = approvalTemplateMapper.selectOne(
-                new LambdaQueryWrapper<ApprovalTemplate>()
-                        .eq(ApprovalTemplate::getBusinessType, 7L)
-                        .eq(ApprovalTemplate::getDeleted, 0)
-                        .orderByDesc(ApprovalTemplate::getId)
-                        .last("LIMIT 1")
-        );
-        if (approvalTemplate == null) {
-            throw new RuntimeException("璇峰厛閰嶇疆鍙戣揣瀹℃壒妯℃澘");
-        }
-        ApprovalInstanceDto approvalInstance = new ApprovalInstanceDto();
-        approvalInstance.setTemplateId(approvalTemplate.getId());
-        approvalInstance.setTemplateName(approvalTemplate.getTemplateName());
-        approvalInstance.setBusinessId(req.getId());
-        approvalInstance.setBusinessType(7L);
-        approvalInstance.setCurrentLevel(1);
-        approvalInstance.setTitle(sh);
-        approvalInstance.setApplicantId(loginUser.getUserId());
-        approvalInstance.setApplicantName(loginUser.getNickName());
-        approvalInstance.setApplyTime(LocalDateTime.now());
-        approvalInstanceService.add(approvalInstance);
-        // 鍒涘缓瀹℃壒瀹炰緥鍚庯紝鏇存柊鍙戣揣鐘舵�佷负"瀹℃牳涓�"锛屼娇鍓嶇姝g‘鏄剧ず瀹℃壒鐘舵��
-        req.setStatus("瀹℃牳涓�");
-        this.updateById(req);
-        return true;
     }
 }
diff --git a/src/main/java/com/ruoyi/sales/vo/CustomerTransactionsDetailsVo.java b/src/main/java/com/ruoyi/sales/vo/CustomerTransactionsDetailsVo.java
index cc205b1..96ed799 100644
--- a/src/main/java/com/ruoyi/sales/vo/CustomerTransactionsDetailsVo.java
+++ b/src/main/java/com/ruoyi/sales/vo/CustomerTransactionsDetailsVo.java
@@ -24,13 +24,10 @@
     @Schema(description = "鍚堝悓閲戦")
     private BigDecimal contractAmount;
 
-    @Schema(description = "鏀舵閲戦")
-    private BigDecimal receiptPaymentAmount;
+    @Schema(description = "宸插嚭搴撻噾棰�")
+    private BigDecimal shippedAmount;
 
-    @Schema(description = "搴旀敹閲戦")
-    private BigDecimal receiptableAmount;
-
-    @Schema(description = "閫�璐ч噾棰�")
-    private BigDecimal returnAmount;
+    @Schema(description = "鏈嚭搴撻噾棰�")
+    private BigDecimal unshippedAmount;
 
 }
diff --git a/src/main/java/com/ruoyi/sales/vo/CustomerTransactionsVo.java b/src/main/java/com/ruoyi/sales/vo/CustomerTransactionsVo.java
index a6c7d7f..a88b6ea 100644
--- a/src/main/java/com/ruoyi/sales/vo/CustomerTransactionsVo.java
+++ b/src/main/java/com/ruoyi/sales/vo/CustomerTransactionsVo.java
@@ -16,18 +16,12 @@
     private String customerName;
 
     @Schema(description = "鍚堝悓鎬婚噾棰�")
-    //璇ュ鎴烽攢鍞悎鍚岀疮璁¢噾棰�
     private BigDecimal contractAmounts;
 
-    @Schema(description = "鏀舵閲戦")
-    //璇ュ鎴烽攢鍞敹娆剧疮璁¢噾棰�
-    private BigDecimal receiptPaymentAmount;
+    @Schema(description = "宸插嚭搴撻噾棰�")
+    private BigDecimal shippedAmount;
 
-    @Schema(description = "搴旀敹閲戦")
-    //璇ュ鎴烽攢鍞簲鏀剁疮璁¢噾棰�=鍒濆閲戦-鍥炴-閫�娆�
-    private BigDecimal receiptableAmount;
-
-    @Schema(description = "閫�璐ч噾棰�")
-    private BigDecimal returnAmount;
+    @Schema(description = "鏈嚭搴撻噾棰�")
+    private BigDecimal unshippedAmount;
 
 }
diff --git a/src/main/java/com/ruoyi/staff/controller/HolidayApplicationController.java b/src/main/java/com/ruoyi/staff/controller/HolidayApplicationController.java
index 6498ef9..ab70220 100644
--- a/src/main/java/com/ruoyi/staff/controller/HolidayApplicationController.java
+++ b/src/main/java/com/ruoyi/staff/controller/HolidayApplicationController.java
@@ -1,6 +1,8 @@
 package com.ruoyi.staff.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.staff.pojo.HolidayApplication;
 import com.ruoyi.staff.service.HolidayApplicationService;
@@ -23,6 +25,7 @@
     /**
      * 鏂板璇峰亣鐢宠
      */
+    @Log(title = "鏂板璇峰亣鐢宠", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public AjaxResult add(@RequestBody HolidayApplication holidayApplication){
         return AjaxResult.success(holidayApplicationService.save(holidayApplication));
@@ -30,6 +33,7 @@
     /**
      * 淇敼璇峰亣鐢宠
      */
+    @Log(title = "淇敼璇峰亣鐢宠", businessType = BusinessType.UPDATE)
     @PostMapping("/update")
     public AjaxResult update(@RequestBody HolidayApplication holidayApplication){
         return AjaxResult.success(holidayApplicationService.updateById(holidayApplication));
@@ -37,6 +41,7 @@
     /**
      * 鍒犻櫎璇峰亣鐢宠
      */
+    @Log(title = "鍒犻櫎璇峰亣鐢宠", businessType = BusinessType.DELETE)
     @DeleteMapping("/delete/{id}")
     public AjaxResult delete(@PathVariable("id") Long id){
         return AjaxResult.success(holidayApplicationService.removeById(id));
diff --git a/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceLocationConfigController.java b/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceLocationConfigController.java
index fc9cf4c..be2c171 100644
--- a/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceLocationConfigController.java
+++ b/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceLocationConfigController.java
@@ -1,9 +1,8 @@
 package com.ruoyi.staff.controller;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.OrderItem;
-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.R;
 import com.ruoyi.staff.pojo.PersonalAttendanceLocationConfig;
 import com.ruoyi.staff.service.PersonalAttendanceLocationConfigService;
@@ -31,12 +30,11 @@
     private final PersonalAttendanceLocationConfigService personalAttendanceLocationConfigService;
 
     @Operation(summary = "鏂板/淇敼浜哄憳鎵撳崱瑙勫垯閰嶇疆")
+    @Log(title = "鏂板/淇敼浜哄憳鎵撳崱瑙勫垯閰嶇疆", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public R add(@RequestBody PersonalAttendanceLocationConfig personalAttendanceLocationConfig){
-        if (personalAttendanceLocationConfig.getId() != null
-                && !personalAttendanceLocationConfigService.canEdit(personalAttendanceLocationConfig.getId())) {
-            return R.fail("璇ョ彮娆¢厤缃凡琚帓鐝苟浜х敓鎵撳崱璁板綍锛屼笉鑳界紪杈�");
-        }
+
+
         // 鐝闇�瑕佷笉鑳藉閲嶅
         if (personalAttendanceLocationConfig.getId() == null && personalAttendanceLocationConfigService.lambdaQuery().eq(PersonalAttendanceLocationConfig::getShift, personalAttendanceLocationConfig.getShift()).one() != null) {
             return R.fail("鐝涓嶈兘閲嶅");
@@ -46,35 +44,15 @@
 
     @Operation(summary = "鍒嗛〉鏌ヨ浜哄憳鎵撳崱瑙勫垯閰嶇疆")
     @GetMapping("/listPage")
-    public R listPage(Page page, PersonalAttendanceLocationConfig query){
-        page.addOrder(OrderItem.desc("id"));
-        LambdaQueryWrapper<PersonalAttendanceLocationConfig> wrapper = new LambdaQueryWrapper<PersonalAttendanceLocationConfig>()
-                .ne(PersonalAttendanceLocationConfig::getId, 999);
-        if (query.getSysDeptId() != null) {
-            wrapper.eq(PersonalAttendanceLocationConfig::getSysDeptId, query.getSysDeptId());
-        }
-        if (query.getShift() != null && !query.getShift().isEmpty()) {
-            wrapper.eq(PersonalAttendanceLocationConfig::getShift, query.getShift());
-        }
-        IPage<PersonalAttendanceLocationConfig> result = personalAttendanceLocationConfigService.page(page, wrapper);
-        result.getRecords().forEach(item -> {
-            boolean locked = personalAttendanceLocationConfigService.hasAttendanceUsage(item.getId());
-            item.setUsageLocked(locked);
-            item.setCanEdit(!locked);
-            item.setCanDelete(!locked);
-        });
-        return R.ok(result);
+    public R listPage(Page page){
+        return R.ok(personalAttendanceLocationConfigService.page(page));
     }
 
 
     @Operation(summary = "鍒犻櫎浜哄憳鎵撳崱瑙勫垯閰嶇疆")
+    @Log(title = "鍒犻櫎浜哄憳鎵撳崱瑙勫垯閰嶇疆", businessType = BusinessType.DELETE)
     @DeleteMapping("/del")
     public R del(@RequestBody List<Integer> ids) {
-        for (Integer id : ids) {
-            if (!personalAttendanceLocationConfigService.canDelete(id)) {
-                return R.fail("瀛樺湪宸叉帓鐝笖宸叉湁鎵撳崱璁板綍鐨勭彮娆¢厤缃紝涓嶈兘鍒犻櫎");
-            }
-        }
         return R.ok(personalAttendanceLocationConfigService.removeBatchByIds(ids));
     }
 
diff --git a/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java b/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java
index 37902fa..10b8481 100644
--- a/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java
+++ b/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java
@@ -1,6 +1,8 @@
 package com.ruoyi.staff.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.staff.dto.PersonalAttendanceRecordsDto;
 import com.ruoyi.staff.pojo.PersonalAttendanceRecords;
@@ -27,6 +29,7 @@
     @Resource
     private PersonalAttendanceRecordsService personalAttendanceRecordsService;
 
+    @Log(title = "涓汉鑰冨嫟璁板綍", businessType = BusinessType.INSERT)
     @Operation(summary = "鏂板鎵撳崱绛惧埌")
     @PostMapping("")
     public AjaxResult add(@RequestBody PersonalAttendanceRecordsDto personalAttendanceRecordsDto){
@@ -45,6 +48,7 @@
         return AjaxResult.success(personalAttendanceRecordsService.todayInfo(personalAttendanceRecordsDto));
     }
 
+    @Log(title = "涓汉鑰冨嫟璁板綍", businessType = BusinessType.EXPORT)
     @Operation(summary = "瀵煎嚭鎵撳崱绛惧埌")
     @PostMapping("/export")
     public void export(HttpServletResponse response, PersonalAttendanceRecordsDto personalAttendanceRecordsDto) {
diff --git a/src/main/java/com/ruoyi/staff/controller/PersonalShiftController.java b/src/main/java/com/ruoyi/staff/controller/PersonalShiftController.java
index a86dcb4..fea072e 100644
--- a/src/main/java/com/ruoyi/staff/controller/PersonalShiftController.java
+++ b/src/main/java/com/ruoyi/staff/controller/PersonalShiftController.java
@@ -4,6 +4,8 @@
 import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
 import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
 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.R;
 import com.ruoyi.staff.dto.PerformanceShiftAddDto;
 import com.ruoyi.staff.pojo.PersonalAttendanceLocationConfig;
@@ -42,6 +44,7 @@
     private PersonalShiftService personalShiftService;
 
     @Operation(summary = "浜哄憳鎺掔彮")
+    @Log(title = "鏂板浜哄憳鎺掔彮", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public R add(@RequestBody PerformanceShiftAddDto performanceShiftAddDto){
         return R.ok(personalShiftService.performanceShiftAdd(performanceShiftAddDto));
@@ -60,13 +63,15 @@
     }
 
     @Operation(summary = "鐝鐘舵�佷慨鏀�")
-    @PostMapping("/update")
+    @Log(title = "淇敼鐝鐘舵��", businessType = BusinessType.UPDATE)
+    @PostMapping("update")
     public R performanceShiftUpdate(@RequestBody PersonalShift personalShift) {
         personalShiftService.performanceShiftUpdate(personalShift);
         return R.ok();
     }
 
     @Operation(summary = "瀵煎嚭")
+    @Log(title = "瀵煎嚭浜哄憳鎺掔彮", businessType = BusinessType.EXPORT)
     @GetMapping("export")
     public void exportToExcel(@NotNull(message = "鏃堕棿涓嶈兘涓虹┖锛�") String time, String userName, Integer sysDeptId, Boolean isMonth, HttpServletResponse response) throws Exception {
         ServletOutputStream out = response.getOutputStream();
diff --git a/src/main/java/com/ruoyi/staff/controller/StaffLeaveController.java b/src/main/java/com/ruoyi/staff/controller/StaffLeaveController.java
index 64a35d9..e2a5893 100644
--- a/src/main/java/com/ruoyi/staff/controller/StaffLeaveController.java
+++ b/src/main/java/com/ruoyi/staff/controller/StaffLeaveController.java
@@ -1,6 +1,8 @@
 package com.ruoyi.staff.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.staff.dto.StaffLeaveDto;
 import com.ruoyi.staff.service.StaffLeaveService;
@@ -37,6 +39,7 @@
      * @param staffLeaveDto
      * @return
      */
+    @Log(title = "鏂板绂昏亴璁板綍", businessType = BusinessType.INSERT)
     @PostMapping("")
     public AjaxResult add(@RequestBody StaffLeaveDto staffLeaveDto) {
         return AjaxResult.success(staffLeaveService.add(staffLeaveDto));
@@ -48,6 +51,7 @@
      * @param staffLeaveDto
      * @return
      */
+    @Log(title = "淇敼绂昏亴璁板綍", businessType = BusinessType.UPDATE)
     @PutMapping("/{id}")
     public AjaxResult update(@PathVariable("id") Long id, @RequestBody StaffLeaveDto staffLeaveDto) {
         return AjaxResult.success(staffLeaveService.update(id, staffLeaveDto));
@@ -58,6 +62,7 @@
      * @param ids
      * @return
      */
+    @Log(title = "鍒犻櫎绂昏亴璁板綍", businessType = BusinessType.DELETE)
     @DeleteMapping("/del")
     public AjaxResult del(@RequestBody List<Integer> ids) {
         if(CollectionUtils.isEmpty(ids)){
@@ -70,6 +75,7 @@
      * 绂昏亴瀵煎嚭
      * @param staffLeaveDto
      */
+    @Log(title = "瀵煎嚭绂昏亴璁板綍", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response, StaffLeaveDto staffLeaveDto) {
         staffLeaveService.export(response, staffLeaveDto);
diff --git a/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java b/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
index 8eb5334..9dfa6b6 100644
--- a/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
+++ b/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
@@ -39,7 +39,7 @@
      * @return
      */
     @GetMapping("/listPage")
-    public AjaxResult staffOnJobListPage(Page page, StaffOnJobDto staffOnJob) {
+    public AjaxResult staffOnJobListPage(Page page, StaffOnJob staffOnJob) {
         return AjaxResult.success(staffOnJobService.staffOnJobListPage(page, staffOnJob));
     }
 
@@ -57,6 +57,7 @@
      * @param staffOnJob
      * @return
      */
+    @Log(title = "鍦ㄨ亴鍛樺伐", businessType = BusinessType.INSERT)
     @PostMapping("")
     public AjaxResult add(@RequestBody StaffOnJobDto staffOnJob) {
         return AjaxResult.success(staffOnJobService.add(staffOnJob));
@@ -67,6 +68,7 @@
      * @param staffOnJobDto
      * @return
      */
+    @Log(title = "鍦ㄨ亴鍛樺伐", businessType = BusinessType.UPDATE)
     @PutMapping("/{id}")
     public AjaxResult update(@PathVariable("id") Long id, @RequestBody StaffOnJobDto staffOnJobDto) {
         return AjaxResult.success(staffOnJobService.update(id, staffOnJobDto));
@@ -77,6 +79,7 @@
      * @param ids
      * @return
      */
+    @Log(title = "鍦ㄨ亴鍛樺伐", businessType = BusinessType.DELETE)
     @DeleteMapping("/del")
     public AjaxResult delStaffOnJobs(@RequestBody List<Integer> ids) {
         if(CollectionUtils.isEmpty(ids)){
@@ -101,12 +104,14 @@
      * @param staffContract
      * @return
      */
+    @Log(title = "鍦ㄨ亴鍛樺伐", businessType = BusinessType.UPDATE)
     @PostMapping("/renewContract/{id}")
     public AjaxResult renewContract(@PathVariable Long id, @RequestBody StaffContract staffContract) {
         return AjaxResult.success(staffOnJobService.renewContract(id, staffContract));
     }
 
     @Operation(summary = "涓嬭浇妯℃澘")
+    @Log(title = "鍦ㄨ亴鍛樺伐", businessType = BusinessType.EXPORT)
     @PostMapping("/downloadTemplate")
     public void downloadTemplate(HttpServletResponse response) {
         ExcelUtil<StaffOnJobExcelDto> util = new ExcelUtil<>(StaffOnJobExcelDto.class);
@@ -131,6 +136,7 @@
      * @param response
      * @param staffOnJob
      */
+    @Log(title = "鍦ㄨ亴鍛樺伐", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void staffOnJobExport(HttpServletResponse response,StaffOnJob staffOnJob) {
         staffOnJobService.staffOnJobExport(response, staffOnJob);
@@ -141,6 +147,7 @@
      * @param response
      * @param staffOnJob
      */
+    @Log(title = "鍦ㄨ亴鍛樺伐", businessType = BusinessType.EXPORT)
     @PostMapping("/exportCopy")
     @Operation(summary = "word妯℃澘鍚堝悓鍦ㄨ亴鍛樺伐瀵煎嚭")
     public AjaxResult exportCopy(HttpServletResponse response,@RequestBody StaffOnJob staffOnJob) throws Exception{
diff --git a/src/main/java/com/ruoyi/staff/controller/StaffSalaryMainController.java b/src/main/java/com/ruoyi/staff/controller/StaffSalaryMainController.java
index d30bf3a..569ca1c 100644
--- a/src/main/java/com/ruoyi/staff/controller/StaffSalaryMainController.java
+++ b/src/main/java/com/ruoyi/staff/controller/StaffSalaryMainController.java
@@ -5,12 +5,10 @@
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.staff.dto.CalculateSalaryDto;
-import com.ruoyi.staff.dto.StaffSalaryCalculateDto;
 import com.ruoyi.staff.pojo.StaffSalaryMain;
 import com.ruoyi.staff.service.StaffSalaryMainService;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
-import jakarta.servlet.http.HttpServletResponse;
 import lombok.AllArgsConstructor;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
@@ -45,12 +43,6 @@
         return staffSalaryMainService.calculateSalary(calculateSalaryDto);
     }
 
-    @Operation(summary = "鎸夊憳宸ラ噸绠楀伐璧勬槑缁�")
-    @PostMapping("/calculateByEmployeeId")
-    public AjaxResult calculateByEmployeeId(@RequestBody StaffSalaryCalculateDto staffSalaryCalculateDto) {
-        return staffSalaryMainService.calculateSalaryByEmployee(staffSalaryCalculateDto);
-    }
-
     @PostMapping("/add")
     @Operation(summary = "鏂板缓宸ヨ祫琛�")
     @Log(title = "鏂板缓宸ヨ祫琛�", businessType = BusinessType.INSERT)
@@ -75,16 +67,6 @@
         return staffSalaryMainService.delete(ids);
     }
 
-    @PostMapping("/export")
-    @Operation(summary = "瀵煎嚭鍛樺伐钖祫鏄庣粏")
-    public void export(HttpServletResponse response, String salaryMonth) {
-        staffSalaryMainService.exportSalaryDetail(response, salaryMonth);
-    }
 
-    @GetMapping("/availableDepts")
-    @Operation(summary = "鑾峰彇鍙�夐儴闂紙鎺掗櫎宸插彂鏀惧伐璧勮〃鐨勯儴闂級")
-    public AjaxResult getAvailableDepts(String salaryMonth) {
-        return staffSalaryMainService.getAvailableDepts(salaryMonth);
-    }
 
 }
diff --git a/src/main/java/com/ruoyi/staff/controller/StaffSchedulingController.java b/src/main/java/com/ruoyi/staff/controller/StaffSchedulingController.java
index d195e9c..c48d766 100644
--- a/src/main/java/com/ruoyi/staff/controller/StaffSchedulingController.java
+++ b/src/main/java/com/ruoyi/staff/controller/StaffSchedulingController.java
@@ -35,18 +35,21 @@
        return AjaxResult.success(staffSchedulingService.listPage(vo));
     }
 
+    @Log(title = "鍛樺伐鎺掔彮", businessType = BusinessType.INSERT)
     @PostMapping("/save")
     public AjaxResult save(@RequestBody @Validated SaveStaffSchedulingDto saveStaffSchedulingDto){
         staffSchedulingService.saveStaffScheduling(saveStaffSchedulingDto);
         return AjaxResult.success();
     }
 
+    @Log(title = "鍛樺伐鎺掔彮", businessType = BusinessType.DELETE)
     @DeleteMapping("/delByIds")
     public AjaxResult delByIds(@RequestBody List<Integer> ids){
         staffSchedulingService.removeByIds(ids);
         return AjaxResult.success();
     }
 
+    @Log(title = "鍛樺伐鎺掔彮", businessType = BusinessType.DELETE)
     @DeleteMapping("/del/{id}")
     public AjaxResult del(@PathVariable("id") Integer id){
         staffSchedulingService.removeById(id);
diff --git a/src/main/java/com/ruoyi/staff/dto/StaffLeaveDto.java b/src/main/java/com/ruoyi/staff/dto/StaffLeaveDto.java
index 0556e57..3685410 100644
--- a/src/main/java/com/ruoyi/staff/dto/StaffLeaveDto.java
+++ b/src/main/java/com/ruoyi/staff/dto/StaffLeaveDto.java
@@ -36,6 +36,7 @@
     /**
      * 瀹跺涵浣忓潃
      */
+    @Excel(name = "瀹跺涵浣忓潃", sort = 6)
     private String adress;
 
     /**
diff --git a/src/main/java/com/ruoyi/staff/dto/StaffOnJobDto.java b/src/main/java/com/ruoyi/staff/dto/StaffOnJobDto.java
index 69fdbe8..0a2c0ae 100644
--- a/src/main/java/com/ruoyi/staff/dto/StaffOnJobDto.java
+++ b/src/main/java/com/ruoyi/staff/dto/StaffOnJobDto.java
@@ -25,6 +25,4 @@
     @JsonFormat(pattern = "yyyy-MM-dd")
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     private Date contractEndTime;
-
-    private Long sysDeptId;
 }
diff --git a/src/main/java/com/ruoyi/staff/mapper/PersonalShiftMapper.java b/src/main/java/com/ruoyi/staff/mapper/PersonalShiftMapper.java
index ea48d09..8ae881f 100644
--- a/src/main/java/com/ruoyi/staff/mapper/PersonalShiftMapper.java
+++ b/src/main/java/com/ruoyi/staff/mapper/PersonalShiftMapper.java
@@ -31,6 +31,4 @@
     List<Map<String, Object>> performanceShiftYearList(@Param("time") String time, @Param("userName") String userName, @Param("sysDeptId") Integer sysDeptId);
 
     List<PerformanceShiftMapDto> performanceShiftList(@Param("time") String time, @Param("userName") String userName, @Param("sysDeptId") Integer sysDeptId);
-
-    boolean existsAttendanceUsedByConfig(@Param("configId") Integer configId);
 }
diff --git a/src/main/java/com/ruoyi/staff/mapper/SchemeApplicableStaffMapper.java b/src/main/java/com/ruoyi/staff/mapper/SchemeApplicableStaffMapper.java
index 41cd653..f58b76a 100644
--- a/src/main/java/com/ruoyi/staff/mapper/SchemeApplicableStaffMapper.java
+++ b/src/main/java/com/ruoyi/staff/mapper/SchemeApplicableStaffMapper.java
@@ -26,13 +26,6 @@
     List<SchemeApplicableStaff> selectSchemeByStaffId(@Param("staffId") Long staffId);
 
     /**
-     * 鏍规嵁閮ㄩ棬ID鏌ヨ鏈�鏂扮ぞ淇濇柟妗�
-     * @param deptId 閮ㄩ棬ID
-     * @return 鏈�鏂扮ぞ淇濇柟妗�
-     */
-    SchemeApplicableStaff selectLatestSchemeByDeptId(@Param("deptId") Long deptId);
-
-    /**
      * 鏍规嵁绀句繚鏂规ID鏌ヨ瀵瑰簲鐨勬槑缁嗗垪琛�
      * @param schemeId 绀句繚鏂规ID
      * @return 鏂规鏄庣粏鍒楄〃
diff --git a/src/main/java/com/ruoyi/staff/mapper/StaffOnJobMapper.java b/src/main/java/com/ruoyi/staff/mapper/StaffOnJobMapper.java
index 7cad87f..de8a3c0 100644
--- a/src/main/java/com/ruoyi/staff/mapper/StaffOnJobMapper.java
+++ b/src/main/java/com/ruoyi/staff/mapper/StaffOnJobMapper.java
@@ -14,7 +14,7 @@
 @Mapper
 public interface StaffOnJobMapper extends BaseMapper<StaffOnJob> {
 
-    IPage<StaffOnJobDto> staffOnJobListPage(Page page, @Param("staffOnJob") StaffOnJobDto staffOnJob);
+    IPage<StaffOnJobDto> staffOnJobListPage(Page page, @Param("staffOnJob") StaffOnJob staffOnJob);
 
     List<StaffOnJobDto> staffOnJobList(@Param("staffOnJob") StaffOnJob staffOnJob);
 
@@ -42,4 +42,4 @@
      * @return 鍛樺伐鏁版嵁
      */
     StaffOnJob selectStaffByNickName(String staffName);
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/staff/mapper/StaffSalaryMainMapper.java b/src/main/java/com/ruoyi/staff/mapper/StaffSalaryMainMapper.java
index 7e29494..eca5dbe 100644
--- a/src/main/java/com/ruoyi/staff/mapper/StaffSalaryMainMapper.java
+++ b/src/main/java/com/ruoyi/staff/mapper/StaffSalaryMainMapper.java
@@ -4,8 +4,6 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 
-import java.util.List;
-
 /**
  * <p>
  * 鍛樺伐宸ヨ祫涓昏〃 Mapper 鎺ュ彛
@@ -16,7 +14,5 @@
  */
 @Mapper
 public interface StaffSalaryMainMapper extends BaseMapper<StaffSalaryMain> {
-
-    List<String> selectIssuedDeptIds(String salaryMonth);
 
 }
diff --git a/src/main/java/com/ruoyi/staff/pojo/PersonalAttendanceLocationConfig.java b/src/main/java/com/ruoyi/staff/pojo/PersonalAttendanceLocationConfig.java
index 13e93c8..13e0ca5 100644
--- a/src/main/java/com/ruoyi/staff/pojo/PersonalAttendanceLocationConfig.java
+++ b/src/main/java/com/ruoyi/staff/pojo/PersonalAttendanceLocationConfig.java
@@ -61,28 +61,6 @@
 
     @Schema(description = "鐝")
     private String shift;
-
-    /**
-     * 鏄惁宸茶鎺掔彮涓斿凡鏈夋墦鍗¤褰曚娇鐢�
-     */
-    @Schema(description = "鏄惁宸茶鎺掔彮涓斿凡鏈夋墦鍗¤褰曚娇鐢�")
-    @TableField(exist = false)
-    private Boolean usageLocked;
-
-    /**
-     * 鏄惁鍙紪杈�
-     */
-    @Schema(description = "鏄惁鍙紪杈�")
-    @TableField(exist = false)
-    private Boolean canEdit;
-
-    /**
-     * 鏄惁鍙垹闄�
-     */
-    @Schema(description = "鏄惁鍙垹闄�")
-    @TableField(exist = false)
-    private Boolean canDelete;
-
     @Schema(description = "鍒涘缓鐢ㄦ埛")
     @TableField(fill = FieldFill.INSERT)
     private Integer createUser;
diff --git a/src/main/java/com/ruoyi/staff/pojo/StaffOnJob.java b/src/main/java/com/ruoyi/staff/pojo/StaffOnJob.java
index ccf8a57..bff864a 100644
--- a/src/main/java/com/ruoyi/staff/pojo/StaffOnJob.java
+++ b/src/main/java/com/ruoyi/staff/pojo/StaffOnJob.java
@@ -77,6 +77,7 @@
     /**
      * 瀹跺涵浣忓潃
      */
+    @Excel(name = "瀹跺涵浣忓潃", sort = 6)
     private String adress;
 
     /**
diff --git a/src/main/java/com/ruoyi/staff/pojo/StaffSalaryDetail.java b/src/main/java/com/ruoyi/staff/pojo/StaffSalaryDetail.java
index e616c2b..6cbe396 100644
--- a/src/main/java/com/ruoyi/staff/pojo/StaffSalaryDetail.java
+++ b/src/main/java/com/ruoyi/staff/pojo/StaffSalaryDetail.java
@@ -68,9 +68,6 @@
     @Schema(description = "鍏朵粬鏀嚭")
     private BigDecimal otherDeduct;
 
-    @Schema(description = "绀句繚琛ョ即")
-    private BigDecimal socialSupplementAmount;
-
     @Schema(description = "宸ヨ祫涓◣")
     private BigDecimal salaryTax;
 
diff --git a/src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java b/src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java
index 46588d1..a859d14 100644
--- a/src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java
+++ b/src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java
@@ -14,7 +14,7 @@
 public interface IStaffOnJobService extends IService<StaffOnJob> {
 
 
-    IPage<StaffOnJobDto> staffOnJobListPage(Page page, StaffOnJobDto staffOnJob);
+    IPage<StaffOnJobDto> staffOnJobListPage(Page page, StaffOnJob staffOnJob);
 
      StaffOnJobDto staffOnJobDetail(Long id);
 
diff --git a/src/main/java/com/ruoyi/staff/service/PersonalAttendanceLocationConfigService.java b/src/main/java/com/ruoyi/staff/service/PersonalAttendanceLocationConfigService.java
index f5c1205..14afa19 100644
--- a/src/main/java/com/ruoyi/staff/service/PersonalAttendanceLocationConfigService.java
+++ b/src/main/java/com/ruoyi/staff/service/PersonalAttendanceLocationConfigService.java
@@ -13,19 +13,4 @@
  */
 public interface PersonalAttendanceLocationConfigService extends IService<PersonalAttendanceLocationConfig> {
 
-    /**
-     * 鍒ゆ柇鐝閰嶇疆鏄惁宸茶鎺掔彮涓斿凡鏈夋墦鍗¤褰曚娇鐢ㄣ��
-     */
-    boolean hasAttendanceUsage(Integer configId);
-
-    /**
-     * 鍒ゆ柇鐝閰嶇疆鏄惁鍏佽缂栬緫銆�
-     */
-    boolean canEdit(Integer configId);
-
-    /**
-     * 鍒ゆ柇鐝閰嶇疆鏄惁鍏佽鍒犻櫎銆�
-     */
-    boolean canDelete(Integer configId);
-
 }
diff --git a/src/main/java/com/ruoyi/staff/service/StaffSalaryMainService.java b/src/main/java/com/ruoyi/staff/service/StaffSalaryMainService.java
index 0317a3b..1794e43 100644
--- a/src/main/java/com/ruoyi/staff/service/StaffSalaryMainService.java
+++ b/src/main/java/com/ruoyi/staff/service/StaffSalaryMainService.java
@@ -3,9 +3,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.staff.dto.CalculateSalaryDto;
-import com.ruoyi.staff.dto.StaffSalaryCalculateDto;
 import com.ruoyi.staff.pojo.StaffSalaryMain;
-import jakarta.servlet.http.HttpServletResponse;
 import com.baomidou.mybatisplus.extension.service.IService;
 
 import java.util.List;
@@ -29,10 +27,4 @@
     AjaxResult delete(List<Long> ids);
 
     AjaxResult calculateSalary(CalculateSalaryDto calculateSalaryDto);
-
-    AjaxResult calculateSalaryByEmployee(StaffSalaryCalculateDto staffSalaryCalculateDto);
-
-    void exportSalaryDetail(HttpServletResponse response, String salaryMonth);
-
-    AjaxResult getAvailableDepts(String salaryMonth);
 }
diff --git a/src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceLocationConfigServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceLocationConfigServiceImpl.java
index 7548db8..b1dffca 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceLocationConfigServiceImpl.java
+++ b/src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceLocationConfigServiceImpl.java
@@ -1,12 +1,15 @@
 package com.ruoyi.staff.service.impl;
 
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.staff.mapper.PersonalAttendanceLocationConfigMapper;
-import com.ruoyi.staff.mapper.PersonalShiftMapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.staff.pojo.PersonalAttendanceLocationConfig;
+import com.ruoyi.staff.mapper.PersonalAttendanceLocationConfigMapper;
 import com.ruoyi.staff.service.PersonalAttendanceLocationConfigService;
-import lombok.RequiredArgsConstructor;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+
+import java.util.List;
 
 /**
  * <p>
@@ -17,26 +20,6 @@
  * @since 2026-02-11 09:41:34
  */
 @Service
-@RequiredArgsConstructor
 public class PersonalAttendanceLocationConfigServiceImpl extends ServiceImpl<PersonalAttendanceLocationConfigMapper, PersonalAttendanceLocationConfig> implements PersonalAttendanceLocationConfigService {
 
-    private final PersonalShiftMapper personalShiftMapper;
-
-    @Override
-    public boolean hasAttendanceUsage(Integer configId) {
-        if (configId == null) {
-            return false;
-        }
-        return personalShiftMapper.existsAttendanceUsedByConfig(configId);
-    }
-
-    @Override
-    public boolean canEdit(Integer configId) {
-        return !hasAttendanceUsage(configId);
-    }
-
-    @Override
-    public boolean canDelete(Integer configId) {
-        return !hasAttendanceUsage(configId);
-    }
 }
diff --git a/src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceRecordsServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceRecordsServiceImpl.java
index 14d522c..48c6745 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceRecordsServiceImpl.java
+++ b/src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceRecordsServiceImpl.java
@@ -72,8 +72,7 @@
         List<PersonalShift> personalShifts = personalShiftMapper.selectList(Wrappers.<PersonalShift>lambdaQuery()
                 .eq(PersonalShift::getStaffOnJobId, staffOnJob.getId())
                 .eq(PersonalShift::getWorkTime, currentDate.atStartOfDay())
-                .isNotNull(PersonalShift::getPersonalAttendanceLocationConfigId)
-                .ne(PersonalShift::getPersonalAttendanceLocationConfigId, 999));
+                .isNotNull(PersonalShift::getPersonalAttendanceLocationConfigId));
         if (CollectionUtil.isEmpty(personalShifts)){
             throw new BaseException("褰撳墠鐢ㄦ埛褰撳ぉ娌℃湁鎺掔彮鏁版嵁");
         }
@@ -231,15 +230,12 @@
         List<PersonalShift> personalShifts = personalShiftMapper.selectList(Wrappers.<PersonalShift>lambdaQuery()
                 .eq(PersonalShift::getStaffOnJobId, staffOnJob.getId())
                 .eq(PersonalShift::getWorkTime, currentDate.atStartOfDay())
-                .isNotNull(PersonalShift::getPersonalAttendanceLocationConfigId)
-                .ne(PersonalShift::getPersonalAttendanceLocationConfigId, 999));
+                .isNotNull(PersonalShift::getPersonalAttendanceLocationConfigId));
         if (CollectionUtil.isNotEmpty(personalShifts)){
             PersonalAttendanceLocationConfig personalAttendanceLocationConfig = personalAttendanceLocationConfigMapper.selectById(personalShifts.get(0).getPersonalAttendanceLocationConfigId());
-            if (personalAttendanceLocationConfig != null) {
-                resultDto.setStartAt(personalAttendanceLocationConfig.getStartAt());
-                resultDto.setEndAt(personalAttendanceLocationConfig.getEndAt());
-                resultDto.setShift(personalAttendanceLocationConfig.getShift());
-            }
+            resultDto.setStartAt(personalAttendanceLocationConfig.getStartAt());
+            resultDto.setEndAt(personalAttendanceLocationConfig.getEndAt());
+            resultDto.setShift(personalAttendanceLocationConfig.getShift());
         }
         return resultDto;
     }
diff --git a/src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java
index 60607ba..bd61ca3 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java
+++ b/src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java
@@ -25,7 +25,6 @@
 import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
-import java.math.RoundingMode;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -60,7 +59,6 @@
                 schemeApplicableStaffLambdaQueryWrapper.like(SchemeApplicableStaff::getTitle, schemeApplicableStaff.getTitle());
             }
         }
-        schemeApplicableStaffLambdaQueryWrapper.orderByDesc(SchemeApplicableStaff::getId);
         Page<SchemeApplicableStaff> page1 = schemeApplicableStaffMapper.selectPage(page, schemeApplicableStaffLambdaQueryWrapper);
         List<Long> collect = page1.getRecords().stream().map(SchemeApplicableStaff::getId).collect(Collectors.toList());
         if(CollectionUtils.isEmpty(collect)){
@@ -154,85 +152,100 @@
      * @param id
      */
     public void calculateByEmployeeId(Integer id,Map<String, Object> map,String date) {
-        if (id == null || map == null) {
-            return;
+        // 1. 鍏ュ弬鏍¢獙
+        if (id == null) {
+            return; // 鎴栬繑鍥炵┖鍒楄〃锛屾牴鎹笟鍔¢渶姹傝皟鏁�
         }
         Long staffId = id.longValue();
+        // 绀句繚閲戦
+        BigDecimal socialPersonal = new BigDecimal("0.00");
+        // 鍏Н閲戦噾棰�
+        BigDecimal fundPersonal = new BigDecimal("0.00");
+        // 鍩烘湰宸ヨ祫
+        BigDecimal basicSalary = new BigDecimal("0.00");
+        map.put("fundPersonal", fundPersonal); // 鍏Н閲�
+        map.put("socialPersonal", socialPersonal); // 绀句繚閲戦
+        map.put("basicSalary", basicSalary); // 鍩烘湰宸ヨ祫
+        // 涓◣閲戦
+        BigDecimal salaryTax = new BigDecimal("0.00");
+        map.put("salaryTax", salaryTax);
+        // 璁′欢宸ヨ祫
+        BigDecimal pieceSalary = new BigDecimal("0.00");
+        map.put("pieceSalary", pieceSalary);
+        // 璁℃椂宸ヨ祫
+        BigDecimal hourlySalary = new BigDecimal("0.00");
+        map.put("hourlySalary", hourlySalary);
+        // 鍏朵粬鏀跺叆
+        BigDecimal otherIncome = new BigDecimal("0.00");
+        map.put("otherIncome", otherIncome);
+        // 鍏朵粬鏀嚭
+        BigDecimal otherDeduct = new BigDecimal("0.00");
+        map.put("otherDeduct", otherDeduct);
+        // 搴斿彂宸ヨ祫
+        BigDecimal grossSalary = new BigDecimal("0.00");
+        map.put("grossSalary", grossSalary);
+        // 搴旀墸宸ヨ祫
+        BigDecimal deductSalary = new BigDecimal("0.00");
+        map.put("deductSalary", deductSalary);
+        // 瀹炲彂宸ヨ祫
+        BigDecimal netSalary = new BigDecimal("0.00");
+        map.put("netSalary", netSalary);
+        // 璋冪敤鍩烘湰宸ヨ祫
         StaffOnJob staffOnJobDto = staffOnJobMapper.selectById(staffId);
         if(staffOnJobDto == null){
             return;
         }
-        BigDecimal basicSalary = hasValue(map, "basicSalary")
-                ? normalizeMoney(getBigDecimal(map, "basicSalary"))
-                : normalizeMoney(staffOnJobDto.getBasicSalary());
-        BigDecimal otherIncome = normalizeMoney(getBigDecimal(map, "otherIncome"));
-        BigDecimal otherDeduct = normalizeMoney(getBigDecimal(map, "otherDeduct"));
-        BigDecimal socialSupplementAmount = hasValue(map, "socialSupplementAmount")
-                ? normalizeMoney(getBigDecimal(map, "socialSupplementAmount"))
-                : calculateLatestDeptSocialSupplementAmount(staffOnJobDto);
-        BigDecimal pieceSalary = normalizeMoney(getBigDecimal(map, "pieceSalary"));
-        BigDecimal hourlySalary = normalizeMoney(getBigDecimal(map, "hourlySalary"));
-        BigDecimal socialPersonal = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
-        BigDecimal fundPersonal = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
-
+        basicSalary = staffOnJobDto.getBasicSalary();
+        map.put("basicSalary", basicSalary);
+        // 搴斿彂宸ヨ祫
+        map.put("grossSalary", basicSalary);
+        // 涓◣閲戦锛堟棤绀句繚鐗堬級
+        BigDecimal bigDecimal = TaxCalculator.calculateMonthlyTax(basicSalary, socialPersonal, fundPersonal);
+        map.put("salaryTax", bigDecimal);
+        // 璁℃椂宸ヨ祫 璁′欢宸ヨ祫
         UserProductionAccountingDto userProductionAccountingDto = new UserProductionAccountingDto();
         userProductionAccountingDto.setUserId(getUidByStaffId(staffId));
         userProductionAccountingDto.setDate(date);
         UserAccountDto byUserId = salesLedgerProductionAccountingService.getByUserId(userProductionAccountingDto);
         if(byUserId != null){
-            pieceSalary = normalizeMoney(byUserId.getAccountBalance());
-            hourlySalary = normalizeMoney(byUserId.getAccount());
+            map.put("pieceSalary", byUserId.getAccountBalance());
+            map.put("hourlySalary", byUserId.getAccount());
+            // 搴斿彂 瀹炲彂澧炲姞
+            grossSalary = grossSalary.add(byUserId.getAccountBalance()).add(byUserId.getAccount());
+            map.put("grossSalary", grossSalary);
+            netSalary = netSalary.add(byUserId.getAccountBalance()).add(byUserId.getAccount());
+            map.put("netSalary", netSalary);
         }
-
-        // 鏌ヨ璇ヤ汉鍛樺搴旂殑绀句繚鏂规
+        // 2. 鏌ヨ璇ヤ汉鍛樺搴旂殑绀句繚鏂规
         List<SchemeApplicableStaff> schemeList = schemeApplicableStaffMapper.selectSchemeByStaffId(staffId);
-        if (!CollectionUtils.isEmpty(schemeList)) {
-            for (SchemeApplicableStaff scheme : schemeList) {
-                List<SchemeInsuranceDetail> detailList = schemeApplicableStaffMapper.selectDetailBySchemeId(scheme.getId());
-                if(CollectionUtils.isEmpty(detailList)){
-                    continue;
-                }
-                for (SchemeInsuranceDetail detail : detailList) {
-                    if("鍏Н閲�".equals(detail.getInsuranceType())){
-                        fundPersonal = calculateByEmployeeIdType(detail.getInsuranceType(), fundPersonal, basicSalary, staffOnJobDto, detail);
-                    }else{
-                        socialPersonal = calculateByEmployeeIdType(detail.getInsuranceType(), socialPersonal, basicSalary, staffOnJobDto, detail);
-                    }
+        if (CollectionUtils.isEmpty(schemeList)) {
+            return; // 鏃犲尮閰嶆柟妗堬紝杩斿洖绌哄垪琛�
+        }
+        // 3. 涓烘瘡涓柟妗堝叧鑱旀槑缁嗗垪琛�
+        for (SchemeApplicableStaff scheme : schemeList) {
+            List<SchemeInsuranceDetail> detailList = schemeApplicableStaffMapper.selectDetailBySchemeId(scheme.getId());
+            // 鏍规嵁鏄庣粏鍒楄〃璁$畻绀句繚缂磋垂閲戦
+            if(CollectionUtils.isEmpty(detailList)){
+                continue;
+            }
+            for (SchemeInsuranceDetail detail : detailList) {
+                if("鍏Н閲�".equals(detail.getInsuranceType())){
+                    fundPersonal = fundPersonal.add(calculateByEmployeeIdType(detail.getInsuranceType(),fundPersonal, staffOnJobDto, detail));
+                }else{
+                    socialPersonal = socialPersonal.add(calculateByEmployeeIdType(detail.getInsuranceType(),socialPersonal, staffOnJobDto, detail));
                 }
             }
         }
-
-        BigDecimal grossSalary = basicSalary.add(pieceSalary).add(hourlySalary).add(otherIncome);
-        BigDecimal salaryTax = TaxCalculator.calculateMonthlyTax(
-                grossSalary,
-                socialPersonal.add(socialSupplementAmount),
-                fundPersonal
-        );
-        BigDecimal deductSalary = salaryTax
-                .add(fundPersonal)
-                .add(socialPersonal)
-                .add(socialSupplementAmount)
-                .add(otherDeduct);
-        BigDecimal netSalary = grossSalary.subtract(deductSalary);
-
-        if (!hasText(map, "staffName")) {
-            map.put("staffName", staffOnJobDto.getStaffName());
-        }
-        if (!hasText(map, "nation")) {
-            map.put("nation", staffOnJobDto.getNation());
-        }
-        map.put("basicSalary", basicSalary);
-        map.put("pieceSalary", pieceSalary);
-        map.put("hourlySalary", hourlySalary);
-        map.put("otherIncome", otherIncome);
         map.put("socialPersonal", socialPersonal);
         map.put("fundPersonal", fundPersonal);
-        map.put("otherDeduct", otherDeduct);
-        map.put("socialSupplementAmount", socialSupplementAmount);
-        map.put("grossSalary", grossSalary);
-        map.put("salaryTax", salaryTax);
-        map.put("deductSalary", deductSalary);
-        map.put("netSalary", netSalary);
+        // 涓◣閲戦锛堢ぞ淇濈増锛�
+        bigDecimal = TaxCalculator.calculateMonthlyTax(basicSalary, socialPersonal, fundPersonal);
+        map.put("salaryTax", bigDecimal);
+        // 搴旀墸宸ヨ祫
+        map.put("deductSalary", bigDecimal.add(fundPersonal).add(socialPersonal));
+        // 瀹炲彂宸ヨ祫
+        map.put("netSalary", basicSalary.subtract(bigDecimal).subtract(fundPersonal).subtract(socialPersonal));
+
     }
 
     /**
@@ -263,81 +276,17 @@
      * @param detail
      * @return
      */
-    public BigDecimal calculateByEmployeeIdType(String type,BigDecimal bigDecimal, BigDecimal basicSalary, StaffOnJob staffOnJobDto,SchemeInsuranceDetail detail) {
+    public BigDecimal calculateByEmployeeIdType(String type,BigDecimal bigDecimal, StaffOnJob staffOnJobDto,SchemeInsuranceDetail detail) {
         // 鍒ゆ柇鏄惁璋冪敤鍩烘湰宸ヨ祫
         if (detail.getUseBasicSalary() == 1) {
             BigDecimal divide = detail.getPaymentBase().multiply(detail.getPersonalRatio()).divide(new BigDecimal("100"), 2);
             bigDecimal = bigDecimal.add(divide);
         }else{
-            // 璋冪敤褰撳墠宸ヨ祫琛ㄤ腑鐨勫熀鏈伐璧�
-            BigDecimal multiply = basicSalary.multiply(detail.getPersonalRatio().divide(new BigDecimal("100"), 2));
+            // 璋冪敤鍩烘湰宸ヨ祫
+            BigDecimal multiply = staffOnJobDto.getBasicSalary().multiply(detail.getPersonalRatio().divide(new BigDecimal("100"), 2));
             bigDecimal = bigDecimal.add(multiply);
         }
         bigDecimal = bigDecimal.add(detail.getPersonalFixed());
         return bigDecimal;
-    }
-
-    private BigDecimal calculateLatestDeptSocialSupplementAmount(StaffOnJob staffOnJobDto) {
-        if (staffOnJobDto == null || staffOnJobDto.getSysDeptId() == null) {
-            return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
-        }
-        SchemeApplicableStaff latestScheme = schemeApplicableStaffMapper.selectLatestSchemeByDeptId(staffOnJobDto.getSysDeptId());
-        if (latestScheme == null) {
-            return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
-        }
-        List<SchemeInsuranceDetail> detailList = schemeApplicableStaffMapper.selectDetailBySchemeId(latestScheme.getId());
-        if (CollectionUtils.isEmpty(detailList)) {
-            return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
-        }
-        BigDecimal socialSupplementAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
-        for (SchemeInsuranceDetail detail : detailList) {
-            if (!"鍏Н閲�".equals(detail.getInsuranceType())) {
-                socialSupplementAmount = calculateByEmployeeIdType(
-                        detail.getInsuranceType(),
-                        socialSupplementAmount,
-                        normalizeMoney(staffOnJobDto.getBasicSalary()),
-                        staffOnJobDto,
-                        detail
-                );
-            }
-        }
-        return socialSupplementAmount.setScale(2, RoundingMode.HALF_UP);
-    }
-
-    private boolean hasValue(Map<String, Object> map, String key) {
-        return map != null && map.get(key) != null;
-    }
-
-    private boolean hasText(Map<String, Object> map, String key) {
-        if (map == null) {
-            return false;
-        }
-        Object value = map.get(key);
-        return value != null && !String.valueOf(value).trim().isEmpty();
-    }
-
-    private BigDecimal getBigDecimal(Map<String, Object> map, String key) {
-        if (map == null) {
-            return null;
-        }
-        Object value = map.get(key);
-        if (value == null) {
-            return null;
-        }
-        if (value instanceof BigDecimal) {
-            return (BigDecimal) value;
-        }
-        if (value instanceof Number) {
-            return new BigDecimal(String.valueOf(value));
-        }
-        String text = String.valueOf(value).trim();
-        if (text.isEmpty()) {
-            return null;
-        }
-        return new BigDecimal(text);
-    }
-
-    private BigDecimal normalizeMoney(BigDecimal value) {
-        return value == null ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : value.setScale(2, RoundingMode.HALF_UP);
     }
 }
diff --git a/src/main/java/com/ruoyi/staff/service/impl/StaffLeaveServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/StaffLeaveServiceImpl.java
index 4978d0f..548323d 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/StaffLeaveServiceImpl.java
+++ b/src/main/java/com/ruoyi/staff/service/impl/StaffLeaveServiceImpl.java
@@ -59,7 +59,6 @@
         StaffLeave staffLeave = new StaffLeave();
         staffLeave.setStaffOnJobId(staffLeaveDto.getStaffOnJobId());
         staffLeave.setReason(staffLeaveDto.getReason());
-        staffLeave.setLeaveDate(staffLeaveDto.getLeaveDate());
         String reason = staffLeaveDto.getReason();
         if (StaffLeaveReasonOther.getCode().equals(reason)){
             staffLeave.setRemark(staffLeaveDto.getRemark());
diff --git a/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
index 1f20da2..7c11041 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
+++ b/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
@@ -7,7 +7,6 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.SecurityUtils;
-import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.dto.WordDateDto;
 import com.ruoyi.project.system.domain.SysDept;
@@ -68,9 +67,8 @@
 
     //鍦ㄨ亴鍛樺伐鍙拌处鍒嗛〉鏌ヨ
     @Override
-    public IPage<StaffOnJobDto> staffOnJobListPage(Page page, StaffOnJobDto staffOnJob) {
-        IPage<StaffOnJobDto> staffOnJobDtoIPage = staffOnJobMapper.staffOnJobListPage(page, staffOnJob);
-        return staffOnJobDtoIPage;
+    public IPage<StaffOnJobDto> staffOnJobListPage(Page page, StaffOnJob staffOnJob) {
+        return staffOnJobMapper.staffOnJobListPage(page,staffOnJob);
     }
 
     //鏂板鍏ヨ亴
@@ -85,7 +83,6 @@
         }
 
         // 鍒涘缓鍏ヨ亴鏁版嵁
-        syncStudyInfoFromEducation(staffOnJobPrams);
         staffOnJobPrams.setContractExpireTime(staffOnJobPrams.getContractEndTime());
         staffOnJobPrams.setStaffState(1);
         staffOnJobMapper.insert(staffOnJobPrams);
@@ -144,7 +141,6 @@
         // 缁戝畾瀛愯〃鏁版嵁
         bingingStaffOnJobExtra(id,staffOnJobParams);
         // 鏇存柊鍛樺伐鏁版嵁
-        syncStudyInfoFromEducation(staffOnJobParams);
         staffOnJobParams.setContractExpireTime(staffOnJobParams.getContractEndTime());
         return staffOnJobMapper.updateById(staffOnJobParams);
     }
@@ -162,7 +158,6 @@
                     .forEach(staff -> staff.setStaffOnJobId(id)); // 璧嬪��
             staffEducationService.saveBatch(staffOnJobPrams.getStaffEducationList());
         }
-
         // 鏂板宸ヤ綔缁忓巻
         if(CollectionUtils.isNotEmpty(staffOnJobPrams.getStaffWorkExperienceList())){
             staffOnJobPrams.getStaffWorkExperienceList().stream()
@@ -177,28 +172,6 @@
                     .forEach(staff -> staff.setStaffOnJobId(id)); // 璧嬪��
             staffEmergencyContactServiceImpl.saveBatch(staffOnJobPrams.getStaffEmergencyContactList());
         }
-    }
-
-    private void syncStudyInfoFromEducation(StaffOnJob staffOnJobPrams) {
-        if (staffOnJobPrams == null || CollectionUtils.isEmpty(staffOnJobPrams.getStaffEducationList())) {
-            if (staffOnJobPrams != null) {
-                staffOnJobPrams.setFirstStudy("/");
-                staffOnJobPrams.setProfession("/");
-            }
-            return;
-        }
-        Optional<StaffEducation> matchedEducation = staffOnJobPrams.getStaffEducationList().stream()
-                .filter(Objects::nonNull)
-                .filter(education -> StringUtils.isNotEmpty(education.getMajor()))
-                .findFirst();
-        if (matchedEducation.isPresent()) {
-            StaffEducation education = matchedEducation.get();
-            staffOnJobPrams.setFirstStudy(education.getEducation());
-            staffOnJobPrams.setProfession(education.getMajor());
-            return;
-        }
-        staffOnJobPrams.setFirstStudy("/");
-        staffOnJobPrams.setProfession("/");
     }
 
 
diff --git a/src/main/java/com/ruoyi/staff/service/impl/StaffSalaryMainServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/StaffSalaryMainServiceImpl.java
index 41f8af3..aad785a 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/StaffSalaryMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/staff/service/impl/StaffSalaryMainServiceImpl.java
@@ -4,15 +4,9 @@
 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.poi.ExcelUtil;
 import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.project.system.domain.SysDept;
-import com.ruoyi.project.system.mapper.SysDeptMapper;
 import com.ruoyi.project.system.mapper.SysUserDeptMapper;
-import com.ruoyi.staff.excel.StaffSalaryExportData;
-import jakarta.servlet.http.HttpServletResponse;
 import com.ruoyi.staff.dto.CalculateSalaryDto;
-import com.ruoyi.staff.dto.StaffSalaryCalculateDto;
 import com.ruoyi.staff.mapper.StaffLeaveMapper;
 import com.ruoyi.staff.mapper.StaffSalaryDetailMapper;
 import com.ruoyi.staff.mapper.StaffSalaryMainMapper;
@@ -26,12 +20,8 @@
 import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 /**
  * <p>
@@ -51,7 +41,6 @@
     private final SchemeApplicableStaffServiceImpl schemeApplicableStaffService;
     private final SysUserDeptMapper sysUserDeptMapper;
     private final StaffLeaveMapper staffLeaveMapper;
-    private final SysDeptMapper sysDeptMapper;
 
     @Override
     public AjaxResult listPage(Page page, StaffSalaryMain staffSalaryMain) {
@@ -67,7 +56,6 @@
                 staffSalaryMainLambdaQueryWrapper.eq(StaffSalaryMain::getStatus, staffSalaryMain.getStatus());
             }
         }
-        staffSalaryMainLambdaQueryWrapper.orderByDesc(StaffSalaryMain::getId);
         Page<StaffSalaryMain> page1 = staffSalaryMainMapper.selectPage(page, staffSalaryMainLambdaQueryWrapper);
         page1.getRecords().forEach(main -> {
             List<StaffSalaryDetail> staffSalaryDetailList = staffSalaryDetailMapper.selectList(new LambdaQueryWrapper<StaffSalaryDetail>().eq(StaffSalaryDetail::getMainId, main.getId()));
@@ -78,26 +66,6 @@
 
     @Override
     public AjaxResult add(StaffSalaryMain staffSalaryMain) {
-        if (staffSalaryMain == null || StringUtils.isEmpty(staffSalaryMain.getSalaryMonth())) {
-            return AjaxResult.error("鍙傛暟閿欒");
-        }
-
-        Integer status = staffSalaryMain.getStatus();
-        if (status != null && status == 5) {
-            String salaryMonth = staffSalaryMain.getSalaryMonth();
-            String deptIds = staffSalaryMain.getDeptIds();
-
-            List<StaffSalaryMain> issuedList = staffSalaryMainMapper.selectList(new LambdaQueryWrapper<StaffSalaryMain>()
-                    .eq(StaffSalaryMain::getSalaryMonth, salaryMonth)
-                    .eq(StaffSalaryMain::getStatus, 5));
-
-            for (StaffSalaryMain issued : issuedList) {
-                if (hasOverlappingDept(deptIds, issued.getDeptIds())) {
-                    return AjaxResult.error("鍚屼竴鏈堜唤鍚屼竴閮ㄩ棬宸ヨ祫涓嶅彲浠ュ彂鏀惧娆�");
-                }
-            }
-        }
-
         staffSalaryMainMapper.insert(staffSalaryMain);
         staffSalaryMain.getStaffSalaryDetailList().forEach(detail -> {
             detail.setMainId(staffSalaryMain.getId());
@@ -115,30 +83,6 @@
         if(staffSalaryMain1 == null){
             return AjaxResult.error("鍙傛暟閿欒");
         }
-
-        Integer newStatus = staffSalaryMain.getStatus();
-        if (newStatus != null && newStatus == 5) {
-            String salaryMonth = staffSalaryMain.getSalaryMonth();
-            if (StringUtils.isEmpty(salaryMonth)) {
-                salaryMonth = staffSalaryMain1.getSalaryMonth();
-            }
-            String deptIds = staffSalaryMain.getDeptIds();
-            if (StringUtils.isEmpty(deptIds)) {
-                deptIds = staffSalaryMain1.getDeptIds();
-            }
-
-            List<StaffSalaryMain> issuedList = staffSalaryMainMapper.selectList(new LambdaQueryWrapper<StaffSalaryMain>()
-                    .eq(StaffSalaryMain::getSalaryMonth, salaryMonth)
-                    .eq(StaffSalaryMain::getStatus, 5)
-                    .ne(StaffSalaryMain::getId, staffSalaryMain.getId()));
-
-            for (StaffSalaryMain issued : issuedList) {
-                if (hasOverlappingDept(deptIds, issued.getDeptIds())) {
-                    return AjaxResult.error("鍚屼竴鏈堜唤鍚屼竴閮ㄩ棬宸ヨ祫涓嶅彲浠ュ彂鏀惧娆�");
-                }
-            }
-        }
-
         // 寰呭鏍镐笉鍙紪杈�
 //        if(staffSalaryMain1.getStatus() > 3){
 //            return AjaxResult.error("寰呭鏍镐笉鍙紪杈�");
@@ -190,138 +134,12 @@
         return AjaxResult.success(mapList);
     }
 
-    @Override
-    public AjaxResult calculateSalaryByEmployee(StaffSalaryCalculateDto staffSalaryCalculateDto) {
-        if (staffSalaryCalculateDto == null
-                || staffSalaryCalculateDto.getStaffOnJobId() == null
-                || StringUtils.isEmpty(staffSalaryCalculateDto.getSalaryMonth())) {
-            return AjaxResult.error("鍙傛暟閿欒");
-        }
-        Map<String, Object> map = new HashMap<>();
-        map.put("id", staffSalaryCalculateDto.getStaffOnJobId());
-        map.put("staffOnJobId", staffSalaryCalculateDto.getStaffOnJobId());
-        map.put("salaryMonth", staffSalaryCalculateDto.getSalaryMonth());
-        map.put("staffName", staffSalaryCalculateDto.getStaffName());
-        map.put("postName", staffSalaryCalculateDto.getPostName());
-        map.put("deptName", staffSalaryCalculateDto.getDeptName());
-        if (staffSalaryCalculateDto.getBasicSalary() != null) {
-            map.put("basicSalary", staffSalaryCalculateDto.getBasicSalary());
-        }
-        map.put("pieceSalary", staffSalaryCalculateDto.getPieceSalary());
-        map.put("hourlySalary", staffSalaryCalculateDto.getHourlySalary());
-        map.put("otherIncome", staffSalaryCalculateDto.getOtherIncome());
-        map.put("socialPersonal", staffSalaryCalculateDto.getSocialPersonal());
-        map.put("fundPersonal", staffSalaryCalculateDto.getFundPersonal());
-        map.put("otherDeduct", staffSalaryCalculateDto.getOtherDeduct());
-        map.put("socialSupplementAmount", staffSalaryCalculateDto.getSocialSupplementAmount());
-        map.put("salaryTax", staffSalaryCalculateDto.getSalaryTax());
-        map.put("grossSalary", staffSalaryCalculateDto.getGrossSalary());
-        map.put("deductSalary", staffSalaryCalculateDto.getDeductSalary());
-        map.put("netSalary", staffSalaryCalculateDto.getNetSalary());
-        map.put("remark", staffSalaryCalculateDto.getRemark());
-        schemeApplicableStaffService.calculateByEmployeeId(
-                staffSalaryCalculateDto.getStaffOnJobId().intValue(),
-                map,
-                staffSalaryCalculateDto.getSalaryMonth()
-        );
-        return AjaxResult.success(map);
-    }
-
-    @Override
-    public void exportSalaryDetail(HttpServletResponse response, String salaryMonth) {
-        LambdaQueryWrapper<StaffSalaryMain> mainWrapper = new LambdaQueryWrapper<>();
-        if (StringUtils.isNotEmpty(salaryMonth)) {
-            mainWrapper.eq(StaffSalaryMain::getSalaryMonth, salaryMonth);
-        }
-        List<StaffSalaryMain> mainList = staffSalaryMainMapper.selectList(mainWrapper);
-
-        List<StaffSalaryExportData> exportDataList = new ArrayList<>();
-        for (StaffSalaryMain main : mainList) {
-            List<StaffSalaryDetail> detailList = staffSalaryDetailMapper.selectList(
-                    new LambdaQueryWrapper<StaffSalaryDetail>().eq(StaffSalaryDetail::getMainId, main.getId())
-            );
-
-            for (StaffSalaryDetail detail : detailList) {
-                StaffSalaryExportData exportData = new StaffSalaryExportData();
-                exportData.setSalaryMonth(main.getSalaryMonth());
-                exportData.setSalaryTitle(main.getSalaryTitle());
-                exportData.setStaffName(detail.getStaffName());
-                exportData.setDeptName(detail.getDeptName());
-                exportData.setBasicSalary(detail.getBasicSalary());
-                exportData.setPieceSalary(detail.getPieceSalary());
-                exportData.setHourlySalary(detail.getHourlySalary());
-                exportData.setOtherIncome(detail.getOtherIncome());
-                exportData.setSocialPersonal(detail.getSocialPersonal());
-                exportData.setFundPersonal(detail.getFundPersonal());
-                exportData.setOtherDeduct(detail.getOtherDeduct());
-                exportData.setSocialSupplementAmount(detail.getSocialSupplementAmount());
-                exportData.setSalaryTax(detail.getSalaryTax());
-                exportData.setGrossSalary(detail.getGrossSalary());
-                exportData.setDeductSalary(detail.getDeductSalary());
-                exportData.setNetSalary(detail.getNetSalary());
-                exportData.setRemark(detail.getRemark());
-                exportDataList.add(exportData);
-            }
-        }
-
-        ExcelUtil<StaffSalaryExportData> util = new ExcelUtil<>(StaffSalaryExportData.class);
-        util.exportExcel(response, exportDataList, "鍛樺伐钖祫鏄庣粏");
-    }
-
     public List<Map<String, Object>> setSchemeApplicableStaffUserInfo(List<Long> ids) {
         if(CollectionUtils.isEmpty(ids)){
             return new ArrayList<>();
         }
         // 閫氳繃閮ㄩ棬鑾峰彇浜哄憳id
         return sysUserDeptMapper.setSchemeApplicableStaffUserInfo(ids);
-    }
-
-    @Override
-    public AjaxResult getAvailableDepts(String salaryMonth) {
-        if (StringUtils.isEmpty(salaryMonth)) {
-            return AjaxResult.error("宸ヨ祫鏈堜唤涓嶈兘涓虹┖");
-        }
-
-        List<String> issuedDeptIdStrings = staffSalaryMainMapper.selectIssuedDeptIds(salaryMonth);
-
-        Set<Long> issuedDeptIds = new HashSet<>();
-        for (String deptIds : issuedDeptIdStrings) {
-            if (StringUtils.isNotEmpty(deptIds)) {
-                String[] ids = deptIds.split(",");
-                for (String id : ids) {
-                    issuedDeptIds.add(Long.parseLong(id.trim()));
-                }
-            }
-        }
-
-        List<SysDept> allDepts = sysDeptMapper.selectList(new LambdaQueryWrapper<SysDept>()
-                .eq(SysDept::getStatus, "0")
-                .eq(SysDept::getDelFlag, "0"));
-
-        List<SysDept> availableDepts = new ArrayList<>();
-        for (SysDept dept : allDepts) {
-            if (!issuedDeptIds.contains(dept.getDeptId())) {
-                availableDepts.add(dept);
-            }
-        }
-
-        return AjaxResult.success(availableDepts);
-    }
-
-    private boolean hasOverlappingDept(String deptIds1, String deptIds2) {
-        if (StringUtils.isEmpty(deptIds1) || StringUtils.isEmpty(deptIds2)) {
-            return false;
-        }
-
-        Set<String> deptSet1 = new HashSet<>(Arrays.asList(deptIds1.split(",")));
-        String[] deptArray2 = deptIds2.split(",");
-
-        for (String deptId : deptArray2) {
-            if (deptSet1.contains(deptId.trim())) {
-                return true;
-            }
-        }
-        return false;
     }
 
 }
diff --git a/src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java b/src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java
index 660cf31..7351890 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java
@@ -87,15 +87,4 @@
         return AjaxResult.success();
     }
 
-    @PostMapping("/reAudit")
-    @Log(title = "鍑哄簱绠$悊-鍙嶅鍑哄簱", businessType = BusinessType.UPDATE)
-    @Operation(summary = "鎵归噺鍙嶅鍑哄簱璁板綍")
-    public AjaxResult reAudit(@RequestBody StockOutRecordDto approveDto) {
-        if(CollectionUtils.isEmpty(approveDto.getIds())){
-            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
-        }
-        stockOutRecordService.batchReAudit(approveDto.getIds());
-        return AjaxResult.success();
-    }
-
 }
diff --git a/src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java b/src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java
index 3a002e0..0798cdc 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java
@@ -4,6 +4,8 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
 import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.dto.StockUninventoryDto;
@@ -36,6 +38,7 @@
 
     @PostMapping("/addstockUninventory")
     @Operation(summary = "鏂板搴撳瓨")
+    @Log(title = "鏂板涓嶅悎鏍煎簱瀛�", businessType = BusinessType.INSERT)
     public R addstockUninventory(@RequestBody StockUninventoryDto stockUninventoryDto) {
         stockUninventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_IN.getCode()));
         stockUninventoryDto.setRecordId(0L);
@@ -45,6 +48,7 @@
 
     @PostMapping("/subtractstockUninventory")
     @Operation(summary = "鎵e噺搴撳瓨")
+    @Log(title = "鎵e噺涓嶅悎鏍煎簱瀛�", businessType = BusinessType.UPDATE)
     public R subtractstockUninventory(@RequestBody StockUninventoryDto stockUninventoryDto) {
         stockUninventoryDto.setRecordType(String.valueOf(StockOutQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode()));
         stockUninventoryDto.setRecordId(0L);
@@ -53,6 +57,7 @@
 
     @PostMapping("/addStockInRecordOnly")
     @Operation(summary = "鏂板鍏ュ簱璁板綍锛堜粎鍒涘缓璁板綍锛屼笉璋冩暣搴撳瓨锛�")
+    @Log(title = "鏂板涓嶅悎鏍煎簱瀛樺叆搴撹褰�", businessType = BusinessType.INSERT)
     public R addStockInRecordOnly(@RequestBody StockUninventoryDto stockUninventoryDto) {
         stockUninventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_IN.getCode()));
         stockUninventoryDto.setRecordId(0L);
@@ -61,6 +66,7 @@
 
     @PostMapping("/addStockOutRecordOnly")
     @Operation(summary = "鏂板鍑哄簱璁板綍锛堜粎鍒涘缓璁板綍锛屼笉璋冩暣搴撳瓨锛�")
+    @Log(title = "鏂板涓嶅悎鏍煎簱瀛樺嚭搴撹褰�", businessType = BusinessType.INSERT)
     public R addStockOutRecordOnly(@RequestBody StockUninventoryDto stockUninventoryDto) {
         stockUninventoryDto.setRecordType(String.valueOf(StockOutQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode()));
         stockUninventoryDto.setRecordId(0L);
@@ -69,6 +75,7 @@
 
     @PostMapping("/exportStockUninventory")
     @Operation(summary = "瀵煎嚭搴撳瓨")
+    @Log(title = "瀵煎嚭涓嶅悎鏍煎簱瀛�", businessType = BusinessType.EXPORT)
     public void exportStockUninventory(HttpServletResponse response, StockUninventoryDto stockUninventoryDto) {
         stockUninventoryService.exportStockUninventory(response,stockUninventoryDto);
     }
@@ -76,12 +83,14 @@
 
     @PostMapping("/frozenStock")
     @Operation(summary = "鍐荤粨搴撳瓨")
+    @Log(title = "鍐荤粨涓嶅悎鏍煎簱瀛�", businessType = BusinessType.UPDATE)
     public R frozenStock(@RequestBody StockInventoryDto stockInventoryDto) {
         return R.ok(stockUninventoryService.frozenStock(stockInventoryDto));
     }
 
     @PostMapping("/thawStock")
     @Operation(summary = "瑙e喕搴撳瓨")
+    @Log(title = "瑙e喕涓嶅悎鏍煎簱瀛�", businessType = BusinessType.UPDATE)
     public R thawStock(@RequestBody StockInventoryDto stockInventoryDto) {
         return R.ok(stockUninventoryService.thawStock(stockInventoryDto));
     }
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java b/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
index d020761..f9525ee 100644
--- a/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
+++ b/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
@@ -7,14 +7,17 @@
 import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import java.io.Serial;
+import java.io.Serializable;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
 @Data
 @TableName("stock_in_record")
 @Schema(name = "鍏ュ簱绠$悊")
-public class StockInRecord {
+public class StockInRecord implements Serializable {
 
+    @Serial
     private static final long serialVersionUID = 1L;
     /**
      * 搴忓彿
@@ -44,12 +47,14 @@
     private String remark;
 
     @Schema(description = "棰勮鏁伴噺")
+    @TableField(exist = false)
     private BigDecimal warnNum;
 
     @Schema(description = "绫诲瀷  0鍚堟牸鍏ュ簱 1涓嶅悎鏍煎叆搴�")
     private String type;
 
     @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime createTime;
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java b/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java
index 5a35020..1fd2893 100644
--- a/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java
+++ b/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java
@@ -53,6 +53,7 @@
     private String remark;
 
     @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime createTime;
diff --git a/src/main/java/com/ruoyi/stock/service/StockInRecordService.java b/src/main/java/com/ruoyi/stock/service/StockInRecordService.java
index 117b70f..dc7a600 100644
--- a/src/main/java/com/ruoyi/stock/service/StockInRecordService.java
+++ b/src/main/java/com/ruoyi/stock/service/StockInRecordService.java
@@ -12,7 +12,7 @@
 public interface StockInRecordService extends IService<StockInRecord> {
     IPage<StockInRecordDto> listPage(Page page, StockInRecordDto stockInRecordDto);
 
-    int add(StockInRecordDto stockInRecordDto);
+    StockInRecord add(StockInRecordDto stockInRecordDto);
 
     int update(Long id, StockInRecordDto stockInRecordDto);
 
diff --git a/src/main/java/com/ruoyi/stock/service/StockInventoryService.java b/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
index 5d534d5..e06b751 100644
--- a/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
+++ b/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
@@ -6,6 +6,7 @@
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.dto.StockInventoryDto;
+import com.ruoyi.stock.dto.StockOutRecordDto;
 import com.ruoyi.stock.pojo.StockInventory;
 import jakarta.servlet.http.HttpServletResponse;
 import org.springframework.web.multipart.MultipartFile;
@@ -32,7 +33,7 @@
 
     Boolean addStockInRecordOnly(StockInventoryDto stockInventoryDto);
 
-    Boolean addStockOutRecordOnly(StockInventoryDto stockInventoryDto);
+    StockOutRecordDto addStockOutRecordOnly(StockInventoryDto stockInventoryDto);
 
     R importStockInventory(MultipartFile file);
 
diff --git a/src/main/java/com/ruoyi/stock/service/StockOutRecordService.java b/src/main/java/com/ruoyi/stock/service/StockOutRecordService.java
index ca498b3..fa4bb00 100644
--- a/src/main/java/com/ruoyi/stock/service/StockOutRecordService.java
+++ b/src/main/java/com/ruoyi/stock/service/StockOutRecordService.java
@@ -20,7 +20,7 @@
 public interface StockOutRecordService extends IService<StockOutRecord> {
     IPage<StockOutRecordDto> listPage(Page page, StockOutRecordDto stockOutRecordDto);
 
-    int add(StockOutRecordDto stockOutRecordDto);
+    StockOutRecordDto add(StockOutRecordDto stockOutRecordDto);
 
     int update(Long id, StockOutRecordDto stockOutRecordDto);
 
@@ -31,6 +31,4 @@
     void exportStockOutRecord(HttpServletResponse response, StockOutRecordDto stockOutRecordDto);
 
     int batchApprove(List<Long> ids, Integer approvalStatus);
-
-    int batchReAudit(List<Long> ids);
 }
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
index 00161b5..5fbc6b3 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -13,22 +13,12 @@
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
-
-import java.time.LocalDateTime;
 import com.ruoyi.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.dto.StockUninventoryDto;
 import com.ruoyi.stock.execl.StockInRecordExportData;
 import com.ruoyi.production.mapper.ProductionOrderPickMapper;
 import com.ruoyi.production.pojo.ProductionOrderPick;
-import com.ruoyi.procurementrecord.mapper.ReturnManagementMapper;
-import com.ruoyi.procurementrecord.mapper.ReturnSaleProductMapper;
-import com.ruoyi.procurementrecord.pojo.ReturnManagement;
-import com.ruoyi.procurementrecord.pojo.ReturnSaleProduct;
-import com.ruoyi.sales.mapper.SalesLedgerMapper;
-import com.ruoyi.sales.mapper.ShippingInfoMapper;
-import com.ruoyi.sales.pojo.SalesLedger;
-import com.ruoyi.sales.pojo.ShippingInfo;
 import com.ruoyi.stock.mapper.StockInRecordMapper;
 import com.ruoyi.stock.mapper.StockInventoryMapper;
 import com.ruoyi.stock.mapper.StockUninventoryMapper;
@@ -53,10 +43,6 @@
     private StockInventoryMapper stockInventoryMapper;
     private StockUninventoryMapper stockUninventoryMapper;
     private ProductionOrderPickMapper productionOrderPickMapper;
-    private ReturnSaleProductMapper returnSaleProductMapper;
-    private ReturnManagementMapper returnManagementMapper;
-    private ShippingInfoMapper shippingInfoMapper;
-    private SalesLedgerMapper salesLedgerMapper;
 
     @Override
     public IPage<StockInRecordDto> listPage(Page page, StockInRecordDto stockInRecordDto) {
@@ -66,17 +52,13 @@
     // 鏂板鍏ュ簱
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public int add(StockInRecordDto stockInRecordDto) {
-        LocalDateTime createTime = stockInRecordDto.getCreateTime();
-        if (createTime == null) {
-            createTime = LocalDateTime.now();
-        }
-        String no = OrderUtils.countTodayByCreateTime(stockInRecordMapper, "RK","inbound_batches", createTime);
+    public StockInRecord add(StockInRecordDto stockInRecordDto) {
+        String no = OrderUtils.countTodayByCreateTime(stockInRecordMapper, "RK","inbound_batches");
         stockInRecordDto.setInboundBatches(no);
-        stockInRecordDto.setCreateTime(createTime);
         StockInRecord stockInRecord = new StockInRecord();
         BeanUtils.copyProperties(stockInRecordDto, stockInRecord);
-        return stockInRecordMapper.insert(stockInRecord);
+        stockInRecordMapper.insert(stockInRecord);
+        return stockInRecord;
     }
 
     @Override
@@ -88,9 +70,56 @@
             throw new BaseException("璇ュ叆搴撹褰曚笉瀛樺湪,鏃犳硶鏇存柊!!!");
         }
 
+        // 璁板綍淇敼鍓嶇殑 batch_no
+        String oldBatchNo = stockInRecord.getBatchNo();
+        String newBatchNo = stockInRecordDto.getBatchNo();
+
         String[] ignoreProperties = {"id", "inbound_batches"};//鎺掗櫎id灞炴��
         BeanUtils.copyProperties(stockInRecordDto, stockInRecord, ignoreProperties);
-        return stockInRecordMapper.updateById(stockInRecord);
+        int result = stockInRecordMapper.updateById(stockInRecord);
+
+        // 濡傛灉 batch_no 鍙戠敓鍙樺寲锛岄渶瑕佸悓姝ユ洿鏂板叧鑱旇〃
+        if (newBatchNo != null && !newBatchNo.equals(oldBatchNo)) {
+            updateRelatedBatchNo(stockInRecord, oldBatchNo, newBatchNo);
+        }
+
+        return result;
+    }
+
+    /**
+     * 鍚屾鏇存柊鍏宠仈琛ㄧ殑 batch_no
+     * @param stockInRecord 鍏ュ簱璁板綍
+     * @param oldBatchNo 淇敼鍓嶇殑鎵瑰彿
+     * @param newBatchNo 淇敼鍚庣殑鎵瑰彿
+     */
+    private void updateRelatedBatchNo(StockInRecord stockInRecord, String oldBatchNo, String newBatchNo) {
+        // 1. 鏇存柊 stock_inventory 琛紙鍚堟牸搴撳瓨锛�
+        LambdaQueryWrapper<StockInventory> inventoryEq = new LambdaQueryWrapper<StockInventory>()
+                .eq(StockInventory::getProductModelId, stockInRecord.getProductModelId());
+        if (StringUtils.isEmpty(oldBatchNo)) {
+            inventoryEq.isNull(StockInventory::getBatchNo);
+        } else {
+            inventoryEq.eq(StockInventory::getBatchNo, oldBatchNo);
+        }
+        StockInventory stockInventory = stockInventoryMapper.selectOne(inventoryEq);
+        if (stockInventory != null) {
+            stockInventory.setBatchNo(newBatchNo);
+            stockInventoryMapper.updateById(stockInventory);
+        }
+
+        // 2. 鏇存柊 stock_uninventory 琛紙涓嶅悎鏍煎簱瀛橈級
+        LambdaQueryWrapper<StockUninventory> uninventoryEq = new LambdaQueryWrapper<StockUninventory>()
+                .eq(StockUninventory::getProductModelId, stockInRecord.getProductModelId());
+        if (StringUtils.isEmpty(oldBatchNo)) {
+            uninventoryEq.isNull(StockUninventory::getBatchNo);
+        } else {
+            uninventoryEq.eq(StockUninventory::getBatchNo, oldBatchNo);
+        }
+        StockUninventory stockUninventory = stockUninventoryMapper.selectOne(uninventoryEq);
+        if (stockUninventory != null) {
+            stockUninventory.setBatchNo(newBatchNo);
+            stockUninventoryMapper.updateById(stockUninventory);
+        }
     }
 
     @Override
@@ -235,9 +264,9 @@
             if (stockInRecord == null) {
                 throw new BaseException("鍏ュ簱璁板綍涓嶅瓨鍦�,鏃犳硶瀹℃壒!!!");
             }
-            if (stockInRecord.getApprovalStatus() != null && !ReviewStatusEnum.PENDING_REVIEW.getCode().equals(stockInRecord.getApprovalStatus())) {
+            /*if (stockInRecord.getApprovalStatus() != null && !ReviewStatusEnum.PENDING_REVIEW.getCode().equals(stockInRecord.getApprovalStatus())) {
                 throw new BaseException("鍙湁寰呭鎵圭姸鎬佺殑璁板綍鎵嶈兘瀹℃壒,鍏ュ簱鎵规:" + stockInRecord.getInboundBatches());
-            }
+            }*/
             stockInRecord.setApprovalStatus(approvalStatus);
             stockInRecordMapper.updateById(stockInRecord);
 
@@ -257,19 +286,16 @@
                     stockInventoryDto.setBatchNo(stockInRecord.getBatchNo());
                     stockInventoryDto.setQualitity(stockInRecord.getStockInNum());
                     stockInventoryDto.setRemark(stockInRecord.getRemark());
+                    stockInventoryDto.setWarnNum(stockInRecord.getWarnNum());
                     if (stockInventory == null) {
-                        try {
-                            stockInventoryMapper.insert(new StockInventory() {{
-                                setProductModelId(stockInRecord.getProductModelId());
-                                setQualitity(stockInRecord.getStockInNum());
-                                setBatchNo(stockInRecord.getBatchNo());
-                                setRemark(stockInRecord.getRemark());
-                                setWarnNum(stockInRecord.getWarnNum());
-                                setVersion(1);
-                            }});
-                        } catch (org.springframework.dao.DuplicateKeyException e) {
-                            stockInventoryMapper.updateAddStockInventory(stockInventoryDto);
-                        }
+                        stockInventoryMapper.insert(new StockInventory() {{
+                            setProductModelId(stockInRecord.getProductModelId());
+                            setQualitity(stockInRecord.getStockInNum());
+                            setWarnNum(stockInRecord.getWarnNum());
+                            setBatchNo(stockInRecord.getBatchNo());
+                            setRemark(stockInRecord.getRemark());
+                            setVersion(1);
+                        }});
                     } else {
                         stockInventoryMapper.updateAddStockInventory(stockInventoryDto);
                     }
@@ -282,23 +308,17 @@
                     stockUninventoryDto.setQualitity(stockInRecord.getStockInNum());
                     stockUninventoryDto.setRemark(stockInRecord.getRemark());
                     if (stockUninventory == null) {
-                        try {
-                            stockUninventoryMapper.insert(new StockUninventory() {{
-                                setProductModelId(stockInRecord.getProductModelId());
-                                setQualitity(stockInRecord.getStockInNum());
-                                setBatchNo(stockInRecord.getBatchNo());
-                                setRemark(stockInRecord.getRemark());
-                                setVersion(1);
-                            }});
-                        } catch (org.springframework.dao.DuplicateKeyException e) {
-                            stockUninventoryMapper.updateAddStockUnInventory(stockUninventoryDto);
-                        }
+                        stockUninventoryMapper.insert(new StockUninventory() {{
+                            setProductModelId(stockInRecord.getProductModelId());
+                            setQualitity(stockInRecord.getStockInNum());
+                            setBatchNo(stockInRecord.getBatchNo());
+                            setRemark(stockInRecord.getRemark());
+                            setVersion(1);
+                        }});
                     } else {
                         stockUninventoryMapper.updateAddStockUnInventory(stockUninventoryDto);
                     }
                 }
-                // 閿�鍞��璐у叆搴�:鎵e噺閿�鍞彴璐﹀疄闄呭悎鍚岄噾棰�(閫�璐х敓鏁�)
-                handleSalesReturnRefund(stockInRecord);
             }
         }
         return ids.size();
@@ -348,48 +368,5 @@
         }
 
         return ids.size();
-    }
-
-    /**
-     * 閿�鍞��璐у叆搴撳鎵归�氳繃鏃�,鎵e噺瀵瑰簲閿�鍞彴璐︾殑瀹為檯鍚堝悓閲戦銆�
-     * 鍏宠仈閾�:stock_in_record.record_id = return_sale_product.id
-     *        鈫� return_management.shipping_id = shipping_info.id
-     *        鈫� shipping_info.sales_ledger_id = sales_ledger.id
-     * 鍙鐞� record_type 涓� 14(鍚堟牸)鎴� 15(涓嶅悎鏍�)鐨勯攢鍞��璐у叆搴撱��
-     */
-    private void handleSalesReturnRefund(StockInRecord stockInRecord) {
-        String recordType = stockInRecord.getRecordType();
-        if (!StockInQualifiedRecordTypeEnum.RETURN_HE_IN.getCode().equals(recordType)
-                && !StockInQualifiedRecordTypeEnum.RETURN_UNSTOCK_IN.getCode().equals(recordType)) {
-            return;
-        }
-        if (stockInRecord.getRecordId() == null) {
-            return;
-        }
-        ReturnSaleProduct rsp = returnSaleProductMapper.selectById(stockInRecord.getRecordId());
-        if (rsp == null || rsp.getReturnManagementId() == null) {
-            return;
-        }
-        ReturnManagement rm = returnManagementMapper.selectById(rsp.getReturnManagementId());
-        if (rm == null || rm.getShippingId() == null) {
-            return;
-        }
-        ShippingInfo shippingInfo = shippingInfoMapper.selectById(rm.getShippingId());
-        if (shippingInfo == null || shippingInfo.getSalesLedgerId() == null) {
-            return;
-        }
-        SalesLedger salesLedger = salesLedgerMapper.selectById(shippingInfo.getSalesLedgerId());
-        if (salesLedger == null || salesLedger.getContractAmount() == null) {
-            return;
-        }
-        BigDecimal refund = rsp.getAmount() != null ? rsp.getAmount() : BigDecimal.ZERO;
-        if (refund.compareTo(BigDecimal.ZERO) == 0) {
-            return;
-        }
-        BigDecimal baseAmount = salesLedger.getNetContractAmount() != null
-                ? salesLedger.getNetContractAmount()
-                : salesLedger.getContractAmount();
-        salesLedger.setNetContractAmount(baseAmount.subtract(refund));
-        salesLedgerMapper.updateById(salesLedger);
     }
 }
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
index 07d70a5..ce49958 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -37,10 +37,7 @@
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * <p>
@@ -105,11 +102,7 @@
             newStockInventory.setBatchNo(stockInventoryDto.getBatchNo());
             newStockInventory.setLockedQuantity(stockInventoryDto.getLockedQuantity());
             newStockInventory.setWarnNum(stockInventoryDto.getWarnNum());
-            try {
-                stockInventoryMapper.insert(newStockInventory);
-            } catch (org.springframework.dao.DuplicateKeyException e) {
-                stockInventoryMapper.updateAddStockInventory(stockInventoryDto);
-            }
+            stockInventoryMapper.insert(newStockInventory);
         } else {
             stockInventoryMapper.updateAddStockInventory(stockInventoryDto);
         }
@@ -170,10 +163,13 @@
         stockInRecordDto.setStockInNum(stockInventoryDto.getQualitity());
         stockInRecordDto.setBatchNo(batchNo);
         stockInRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
+        stockInRecordDto.setWarnNum(stockInventoryDto.getWarnNum());
         stockInRecordDto.setType("0");
         stockInRecordDto.setRemark(stockInventoryDto.getRemark());
-        stockInRecordDto.setWarnNum(stockInventoryDto.getWarnNum());
-        stockInRecordService.add(stockInRecordDto);
+        StockInRecord stockInRecord = stockInRecordService.add(stockInRecordDto);
+
+        stockInRecordService.batchApprove(Collections.singletonList(stockInRecord.getId()),1);
+
         return true;
     }
 
@@ -255,7 +251,7 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Boolean addStockOutRecordOnly(StockInventoryDto stockInventoryDto) {
+    public StockOutRecordDto addStockOutRecordOnly(StockInventoryDto stockInventoryDto) {
         LambdaQueryWrapper<StockInventory> eq = new LambdaQueryWrapper<>();
         eq.eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId());
         if (StringUtils.isEmpty(stockInventoryDto.getBatchNo())) {
@@ -291,8 +287,8 @@
         stockOutRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
         stockOutRecordDto.setType("0");
         stockOutRecordDto.setRemark(stockInventoryDto.getRemark());
-        stockOutRecordService.add(stockOutRecordDto);
-        return true;
+        StockOutRecordDto add = stockOutRecordService.add(stockOutRecordDto);
+        return add;
     }
 
     @Override
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
index 7138641..b73f8b2 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
@@ -15,8 +15,6 @@
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
-
-import java.time.LocalDateTime;
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.dto.StockOutRecordDto;
 import com.ruoyi.stock.dto.StockUninventoryDto;
@@ -59,18 +57,14 @@
     }
 
     @Override
-    public int add(StockOutRecordDto stockOutRecordDto) {
-        LocalDateTime createTime = stockOutRecordDto.getCreateTime();
-        if (createTime == null) {
-            createTime = LocalDateTime.now();
-        }
-        String no = OrderUtils.countTodayByCreateTime(stockOutRecordMapper, "CK","outbound_batches", createTime);
+    public StockOutRecordDto add(StockOutRecordDto stockOutRecordDto) {
+        String no = OrderUtils.countTodayByCreateTime(stockOutRecordMapper, "CK","outbound_batches");
         stockOutRecordDto.setOutboundBatches(no);
-        stockOutRecordDto.setCreateTime(createTime);
         if (StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode().equals(stockOutRecordDto.getRecordType())){
             stockOutRecordDto.setApprovalStatus(3);
         }
-        return stockOutRecordMapper.insert(stockOutRecordDto);
+        stockOutRecordMapper.insert(stockOutRecordDto);
+        return stockOutRecordDto;
     }
 
     @Override
@@ -180,9 +174,9 @@
             if (stockOutRecord == null) {
                 throw new BaseException("鍑哄簱璁板綍涓嶅瓨鍦�,鏃犳硶瀹℃壒!!!");
             }
-            if (stockOutRecord.getApprovalStatus() != null && !ReviewStatusEnum.PENDING_REVIEW.getCode().equals(stockOutRecord.getApprovalStatus())) {
-                throw new BaseException("鍙湁寰呭鎵圭姸鎬佺殑璁板綍鎵嶈兘瀹℃壒,鍑哄簱鎵规:" + stockOutRecord.getOutboundBatches());
-            }
+            //if (stockOutRecord.getApprovalStatus() != null && !ReviewStatusEnum.PENDING_REVIEW.getCode().equals(stockOutRecord.getApprovalStatus())) {
+            //    throw new BaseException("鍙湁寰呭鎵圭姸鎬佺殑璁板綍鎵嶈兘瀹℃壒,鍑哄簱鎵规:" + stockOutRecord.getOutboundBatches());
+            //}
             stockOutRecord.setApprovalStatus(approvalStatus);
             stockOutRecordMapper.updateById(stockOutRecord);
             // 瀹℃壒閫氳繃鏃讹紝鎵e噺搴撳瓨
@@ -211,26 +205,6 @@
                     stockUninventoryMapper.updateSubtractStockUnInventory(stockUninventoryDto);
                 }
             }
-        }
-        return ids.size();
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public int batchReAudit(List<Long> ids) {
-        if (CollectionUtils.isEmpty(ids)) {
-            throw new BaseException("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
-        }
-        for (Long id : ids) {
-            StockOutRecord stockOutRecord = stockOutRecordMapper.selectById(id);
-            if (stockOutRecord == null) {
-                throw new BaseException("鍑哄簱璁板綍涓嶅瓨鍦�,鏃犳硶閲嶆柊瀹℃牳!!!");
-            }
-            if (!ReviewStatusEnum.REJECTED.getCode().equals(stockOutRecord.getApprovalStatus())) {
-                throw new BaseException("鍙湁椹冲洖鐘舵�佺殑璁板綍鎵嶈兘閲嶆柊瀹℃牳,鍑哄簱鎵规:" + stockOutRecord.getOutboundBatches());
-            }
-            stockOutRecord.setApprovalStatus(ReviewStatusEnum.PENDING_REVIEW.getCode());
-            stockOutRecordMapper.updateById(stockOutRecord);
         }
         return ids.size();
     }
diff --git a/src/main/java/com/ruoyi/technology/controller/TechnologyBomStructureController.java b/src/main/java/com/ruoyi/technology/controller/TechnologyBomStructureController.java
index 3d9048e..5b8ec34 100644
--- a/src/main/java/com/ruoyi/technology/controller/TechnologyBomStructureController.java
+++ b/src/main/java/com/ruoyi/technology/controller/TechnologyBomStructureController.java
@@ -1,5 +1,7 @@
 package com.ruoyi.technology.controller;
 
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.technology.bean.dto.TechnologyBomStructureDto;
 import com.ruoyi.technology.bean.vo.TechnologyBomStructureVo;
@@ -21,6 +23,7 @@
 
     @PostMapping
     @Operation(summary = "鏂板鎴栦慨鏀笲OM缁撴瀯")
+    @Log(title = "鏂板鎴栦慨鏀笲OM缁撴瀯", businessType = BusinessType.INSERT)
     public R addOrUpdate(@RequestBody TechnologyBomStructureDto technologyBomStructureDto) {
         return R.ok(technologyBomStructureService.addTechnologyBomStructure(technologyBomStructureDto));
     }
diff --git a/src/main/java/com/ruoyi/technology/controller/TechnologyOperationController.java b/src/main/java/com/ruoyi/technology/controller/TechnologyOperationController.java
index 4279311..86b2925 100644
--- a/src/main/java/com/ruoyi/technology/controller/TechnologyOperationController.java
+++ b/src/main/java/com/ruoyi/technology/controller/TechnologyOperationController.java
@@ -31,21 +31,21 @@
     }
 
     @PostMapping("/add")
-    @Log(title = "宸ュ簭鏂板", businessType = BusinessType.INSERT)
+    @Log(title = "鏂板宸ュ簭", businessType = BusinessType.INSERT)
     @Operation(summary = "鏂板宸ュ簭")
     public R add(@RequestBody TechnologyOperationDto technologyOperationDto) {
         return technologyOperationService.add(technologyOperationDto);
     }
 
     @PutMapping("/update")
-    @Log(title = "宸ュ簭鏇存柊", businessType = BusinessType.UPDATE)
+    @Log(title = "淇敼宸ュ簭", businessType = BusinessType.UPDATE)
     @Operation(summary = "淇敼宸ュ簭")
     public R update(@RequestBody com.ruoyi.technology.pojo.TechnologyOperation technologyOperation) {
-        return technologyOperationService.update(technologyOperation);
+        return R.ok(technologyOperationService.updateById(technologyOperation));
     }
 
     @DeleteMapping("/batchDelete")
-    @Log(title = "鍒犻櫎宸ュ簭", businessType = BusinessType.DELETE)
+    @Log(title = "鎵归噺鍒犻櫎宸ュ簭", businessType = BusinessType.DELETE)
     @Operation(summary = "鎵归噺鍒犻櫎宸ュ簭")
     public R batchDelete(@RequestBody List<Long> ids) {
         return R.ok(technologyOperationService.batchDelete(ids));
diff --git a/src/main/java/com/ruoyi/technology/controller/TechnologyOperationParamController.java b/src/main/java/com/ruoyi/technology/controller/TechnologyOperationParamController.java
index 92bb773..061a50c 100644
--- a/src/main/java/com/ruoyi/technology/controller/TechnologyOperationParamController.java
+++ b/src/main/java/com/ruoyi/technology/controller/TechnologyOperationParamController.java
@@ -36,7 +36,7 @@
     }
 
     @DeleteMapping("/batchDelete/{id}")
-    @Log(title = "鍒犻櫎宸ュ簭鍙傛暟", businessType = BusinessType.DELETE)
+    @Log(title = "Delete technology operation param", businessType = BusinessType.DELETE)
     @Operation(summary = "鍒犻櫎宸ュ簭鍙傛暟")
     public AjaxResult batchDelete(@PathVariable("id") Long id) {
         return AjaxResult.success(technologyOperationParamService.batchDelete(id));
diff --git a/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingController.java b/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingController.java
index 9ab62e1..768de4e 100644
--- a/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingController.java
+++ b/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingController.java
@@ -2,6 +2,8 @@
 
 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.R;
 import com.ruoyi.technology.bean.dto.TechnologyRoutingDto;
 import com.ruoyi.technology.bean.vo.TechnologyRoutingVo;
@@ -43,8 +45,9 @@
     /**
      * 鏂板宸ヨ壓璺嚎銆�
      */
-    @PostMapping("/addTechRoute")
+    @Log(title = "宸ヨ壓璺嚎", businessType = BusinessType.INSERT)
     @Operation(summary = "鏂板宸ヨ壓璺嚎")
+    @PostMapping("/addTechRoute")
     public R add(@RequestBody TechnologyRouting technologyRouting) {
         return R.ok(technologyRoutingService.saveTechnologyRouting(technologyRouting));
     }
@@ -52,8 +55,9 @@
     /**
      * 淇敼宸ヨ壓璺嚎銆�
      */
-    @PutMapping("/editTechRoute")
+    @Log(title = "宸ヨ壓璺嚎", businessType = BusinessType.UPDATE)
     @Operation(summary = "淇敼宸ヨ壓璺嚎")
+    @PutMapping("/editTechRoute")
     public R edit(@RequestBody TechnologyRouting technologyRouting) {
         return R.ok(technologyRoutingService.updateTechnologyRouting(technologyRouting));
     }
@@ -61,8 +65,9 @@
     /**
      * 鎵归噺鍒犻櫎宸ヨ壓璺嚎銆�
      */
-    @DeleteMapping("/delete")
+    @Log(title = "宸ヨ壓璺嚎", businessType = BusinessType.DELETE)
     @Operation(summary = "鍒犻櫎宸ヨ壓璺嚎")
+    @DeleteMapping("/delete")
     public R remove(@RequestBody List<Long> ids) {
         return R.ok(technologyRoutingService.removeTechnologyRouting(ids));
     }
diff --git a/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationController.java b/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationController.java
index eea52a0..08ba14d 100644
--- a/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationController.java
+++ b/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationController.java
@@ -2,6 +2,8 @@
 
 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.R;
 import com.ruoyi.technology.bean.dto.TechnologyRoutingOperationDto;
 import com.ruoyi.technology.bean.vo.TechnologyRoutingOperationVo;
@@ -41,26 +43,30 @@
         return R.ok(technologyRoutingOperationService.getTechnologyRoutingOperationInfo(id));
     }
 
-    @PostMapping("/add")
+    @Log(title = "宸ヨ壓璺嚎宸ュ簭", businessType = BusinessType.INSERT)
     @Operation(summary = "鏂板宸ヨ壓璺嚎宸ュ簭")
+    @PostMapping("/add")
     public R add(@RequestBody TechnologyRoutingOperation technologyRoutingOperation) {
         return R.ok(technologyRoutingOperationService.saveTechnologyRoutingOperation(technologyRoutingOperation));
     }
 
-    @PutMapping
+    @Log(title = "宸ヨ壓璺嚎宸ュ簭", businessType = BusinessType.UPDATE)
     @Operation(summary = "淇敼宸ヨ壓璺嚎宸ュ簭")
+    @PutMapping
     public R edit(@RequestBody TechnologyRoutingOperation technologyRoutingOperation) {
         return R.ok(technologyRoutingOperationService.updateById(technologyRoutingOperation));
     }
 
-    @DeleteMapping("/{id}")
+    @Log(title = "宸ヨ壓璺嚎宸ュ簭", businessType = BusinessType.DELETE)
     @Operation(summary = "鍒犻櫎宸ヨ壓璺嚎宸ュ簭")
+    @DeleteMapping("/{id}")
     public R remove(@PathVariable("id") Long id) {
         return R.ok(technologyRoutingOperationService.removeTechnologyRoutingOperation(id));
     }
 
-    @PostMapping ("/sort")
+    @Log(title = "宸ヨ壓璺嚎宸ュ簭", businessType = BusinessType.UPDATE)
     @Operation(summary = "鎺掑簭宸ヨ壓璺嚎宸ュ簭")
+    @PostMapping ("/sort")
     public R sort(@RequestBody TechnologyRoutingOperation technologyRoutingOperation) {
         return R.ok(technologyRoutingOperationService.sort(technologyRoutingOperation));
     }
diff --git a/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationParamController.java b/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationParamController.java
index f685471..f8d814b 100644
--- a/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationParamController.java
+++ b/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationParamController.java
@@ -2,6 +2,8 @@
 
 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.R;
 import com.ruoyi.technology.bean.dto.TechnologyRoutingOperationParamDto;
 import com.ruoyi.technology.bean.dto.TechnologyRoutingOperationParamSyncDto;
@@ -44,24 +46,28 @@
 
     @PostMapping("/add")
     @Operation(summary = "鏂板鐢熶骇璁㈠崟宸ヨ壓璺嚎宸ュ簭鍙傛暟")
+    @Log(title = "鏂板宸ヨ壓璺嚎宸ュ簭鍙傛暟", businessType = BusinessType.INSERT)
     public R<Boolean> add(@RequestBody TechnologyRoutingOperationParam technologyRoutingOperationParam) {
         return R.ok(technologyRoutingOperationParamService.saveTechnologyRoutingOperationParam(technologyRoutingOperationParam));
     }
 
     @PutMapping
     @Operation(summary = "淇敼鐢熶骇璁㈠崟宸ヨ壓璺嚎宸ュ簭鍙傛暟")
+    @Log(title = "淇敼宸ヨ壓璺嚎宸ュ簭鍙傛暟", businessType = BusinessType.UPDATE)
     public R<Boolean> edit(@RequestBody TechnologyRoutingOperationParam technologyRoutingOperationParam) {
         return R.ok(technologyRoutingOperationParamService.saveTechnologyRoutingOperationParam(technologyRoutingOperationParam));
     }
 
     @DeleteMapping("/{id}")
     @Operation(summary = "鍒犻櫎鐢熶骇璁㈠崟宸ヨ壓璺嚎宸ュ簭鍙傛暟")
+    @Log(title = "鍒犻櫎宸ヨ壓璺嚎宸ュ簭鍙傛暟", businessType = BusinessType.DELETE)
     public R<Boolean> remove(@PathVariable("id") Long id) {
         return R.ok(technologyRoutingOperationParamService.removeTechnologyRoutingOperationParam(id));
     }
 
     @PostMapping("/sync")
     @Operation(summary = "鎸夊伐鑹鸿矾绾垮伐搴忓悓姝ュ伐搴忓弬鏁�")
+    @Log(title = "鍚屾宸ヨ壓璺嚎宸ュ簭鍙傛暟", businessType = BusinessType.UPDATE)
     public R<Integer> sync(@RequestBody TechnologyRoutingOperationParamSyncDto syncDto) {
         return R.ok(technologyRoutingOperationParamService.syncTechnologyRoutingOperationParam(syncDto));
     }
diff --git a/src/main/java/com/ruoyi/technology/pojo/TechnologyParam.java b/src/main/java/com/ruoyi/technology/pojo/TechnologyParam.java
index 8f2672d..75d56cf 100644
--- a/src/main/java/com/ruoyi/technology/pojo/TechnologyParam.java
+++ b/src/main/java/com/ruoyi/technology/pojo/TechnologyParam.java
@@ -1,10 +1,8 @@
 package com.ruoyi.technology.pojo;
 
 import com.baomidou.mybatisplus.annotation.*;
-import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
-import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
 import java.time.LocalDateTime;
@@ -55,8 +53,6 @@
 
     @Schema(description = "鍒涘缓鏃堕棿")
     @TableField(fill = FieldFill.INSERT)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime createTime;
 
     @Schema(description = "淇敼浜�")
@@ -65,8 +61,6 @@
 
     @Schema(description = "淇敼鏃堕棿")
     @TableField(fill = FieldFill.INSERT_UPDATE)
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime updateTime;
 
     @Schema(description = "閮ㄩ棬ID")
diff --git a/src/main/java/com/ruoyi/technology/pojo/TechnologyRouting.java b/src/main/java/com/ruoyi/technology/pojo/TechnologyRouting.java
index 880662b..1427de6 100644
--- a/src/main/java/com/ruoyi/technology/pojo/TechnologyRouting.java
+++ b/src/main/java/com/ruoyi/technology/pojo/TechnologyRouting.java
@@ -32,6 +32,7 @@
     private String description;
 
     @Schema(description = "褰曞叆鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
     private LocalDateTime createTime;
 
     @Schema(description = "鏇存柊鏃堕棿")
diff --git a/src/main/java/com/ruoyi/technology/service/TechnologyOperationService.java b/src/main/java/com/ruoyi/technology/service/TechnologyOperationService.java
index ec301d6..42ba667 100644
--- a/src/main/java/com/ruoyi/technology/service/TechnologyOperationService.java
+++ b/src/main/java/com/ruoyi/technology/service/TechnologyOperationService.java
@@ -16,8 +16,6 @@
 
     R add(TechnologyOperationDto technologyOperationDto);
 
-    R update(TechnologyOperation technologyOperation);
-
     String batchDelete(List<Long> ids);
 
     List<TechnologyOperationVo> listVo();
diff --git a/src/main/java/com/ruoyi/technology/service/impl/TechnologyOperationServiceImpl.java b/src/main/java/com/ruoyi/technology/service/impl/TechnologyOperationServiceImpl.java
index a407cd6..da9ed8b 100644
--- a/src/main/java/com/ruoyi/technology/service/impl/TechnologyOperationServiceImpl.java
+++ b/src/main/java/com/ruoyi/technology/service/impl/TechnologyOperationServiceImpl.java
@@ -57,27 +57,6 @@
         return R.ok();
     }
 
-    @Override
-    public R update(TechnologyOperation technologyOperation) {
-        if (technologyOperation.getId() == null) {
-            return R.fail("宸ュ簭ID涓嶈兘涓虹┖");
-        }
-        boolean updated = technologyOperationMapper.update(
-                null,
-                Wrappers.<TechnologyOperation>lambdaUpdate()
-                        .eq(TechnologyOperation::getId, technologyOperation.getId())
-                        .set(TechnologyOperation::getName, technologyOperation.getName())
-                        .set(TechnologyOperation::getNo, technologyOperation.getNo())
-                        .set(TechnologyOperation::getRemark, technologyOperation.getRemark())
-                        .set(TechnologyOperation::getSalaryQuota, technologyOperation.getSalaryQuota())
-                        .set(TechnologyOperation::getIsQuality, technologyOperation.getIsQuality())
-                        .set(TechnologyOperation::getIsProduction, technologyOperation.getIsProduction())
-                        .set(TechnologyOperation::getType, technologyOperation.getType())
-                        .set(TechnologyOperation::getDeviceLedgerId, technologyOperation.getDeviceLedgerId())
-        ) > 0;
-        return updated ? R.ok() : R.fail("淇敼澶辫触");
-    }
-
     /**
      * 鍒犻櫎宸ュ簭鍓嶆牎楠屾槸鍚﹀凡琚獴OM缁撴瀯鎴栧伐鑹鸿矾绾垮紩鐢ㄣ��
      */
diff --git a/src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java b/src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java
index f41f659..6750f03 100644
--- a/src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java
+++ b/src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java
@@ -7,8 +7,6 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.OrderUtils;
-
-import java.time.LocalDateTime;
 import com.ruoyi.technology.bean.dto.TechnologyRoutingDto;
 import com.ruoyi.technology.bean.vo.TechnologyRoutingVo;
 import com.ruoyi.production.mapper.ProductionOrderRoutingMapper;
@@ -62,7 +60,7 @@
 
     @Override
     public Long saveTechnologyRouting(TechnologyRouting technologyRouting) {
-        String code = OrderUtils.countTodayByCreateTime(technologyRoutingMapper, "GYLX", "process_route_code", technologyRouting.getCreateTime() != null ? technologyRouting.getCreateTime() : LocalDateTime.now());
+        String code = OrderUtils.countTodayByCreateTime(technologyRoutingMapper, "GYLX", "process_route_code");
         technologyRouting.setProcessRouteCode(code);
         technologyRoutingMapper.insert(technologyRouting);
         // 甯﹀叆bom浜у搧缁撴瀯
diff --git a/src/main/java/com/ruoyi/warehouse/controller/DocumentationFileController.java b/src/main/java/com/ruoyi/warehouse/controller/DocumentationFileController.java
index f272150..9ce000b 100644
--- a/src/main/java/com/ruoyi/warehouse/controller/DocumentationFileController.java
+++ b/src/main/java/com/ruoyi/warehouse/controller/DocumentationFileController.java
@@ -1,5 +1,7 @@
 package com.ruoyi.warehouse.controller;
 
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.warehouse.pojo.DocumentationFile;
 import com.ruoyi.warehouse.service.DocumentationFileService;
@@ -25,6 +27,7 @@
      * @param documentationFile
      * @return
      */
+    @Log(title = "鏂板鏂囨。鏂囦欢", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public AjaxResult add(@RequestBody DocumentationFile documentationFile) {
         return AjaxResult.success(documentationFileService.save(documentationFile));
@@ -35,6 +38,7 @@
      * @param ids
      * @return
      */
+    @Log(title = "鍒犻櫎鏂囨。鏂囦欢", businessType = BusinessType.DELETE)
     @DeleteMapping("/del")
     public AjaxResult delDocumentationFile(@RequestBody List<Long> ids) {
         if(CollectionUtils.isEmpty(ids)){
diff --git a/src/main/resources/application-btyxpro.yml b/src/main/resources/application-btyxpro.yml
new file mode 100644
index 0000000..276093c
--- /dev/null
+++ b/src/main/resources/application-btyxpro.yml
@@ -0,0 +1,266 @@
+# 椤圭洰鐩稿叧閰嶇疆
+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
+  # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
+  approvalNumberPrefix: NEW
+
+  # 涓帹 Unipush 閰嶇疆
+  getui:
+    appId: PfjyAAE0FK64FaO1w2CMb1
+    appKey: zTMb831OEL6J4GK1uE3Ob4
+    masterSecret: K1GFtsv42v61tXGnF7SGE5
+    domain: https://restapi.getui.cn/v2/
+    # 绂荤嚎鎺ㄩ�佷娇鐢ㄧ殑鍖呭悕/缁勪欢鍚�
+    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9003
+  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: jxc
+# 鐢ㄦ埛閰嶇疆
+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-btyx-pro?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 閰嶇疆
+  data:
+    # 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
+
+  # Quartz瀹氭椂浠诲姟閰嶇疆锛堟柊澧為儴鍒嗭級
+  quartz:
+    job-store-type: jdbc  # 浣跨敤鏁版嵁搴撳瓨鍌�
+    jdbc:
+      initialize-schema: never  # 棣栨杩愯鏃惰嚜鍔ㄥ垱寤鸿〃缁撴瀯锛屾垚鍔熷悗鏀逛负never
+      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL琛ㄧ粨鏋勮剼鏈�
+    properties:
+      org:
+        quartz:
+          scheduler:
+            instanceName: RuoYiScheduler
+            instanceId: AUTO
+          jobStore:
+            class: org.quartz.impl.jdbcjobstore.JobStoreTX
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL閫傞厤
+            tablePrefix: qrtz_  # 琛ㄥ悕鍓嶇紑锛屼笌鑴氭湰涓�鑷�
+            isClustered: false  # 鍗曡妭鐐规ā寮忥紙闆嗙兢闇�鏀逛负true锛�
+            clusterCheckinInterval: 10000
+            txIsolationLevelSerializable: true
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 10  # 绾跨▼姹犲ぇ灏�
+            threadPriority: 5
+            makeThreadsDaemons: true
+          updateCheck: false  # 鍏抽棴鐗堟湰妫�鏌�
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: xpAVjhCjQDaDB7mjPAzMDSbQWXNu2zYkTdDNUsPMS5Xx8QMmQVYN7n74eZrYJxDJ
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿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 # 姝e紡鐩綍
+  path: /javaWork/product-inventory-management/file # 涓婁紶鐩綍
+  urlPrefix: /prod-api/common # 閾炬帴鍓嶇紑
+  domain: http://1.15.17.182:9056 # 鍩熷悕鍓嶇紑
+  expired: 120 # 杩囨湡鏃堕棿(鍗曚綅:鍒嗛挓)
+  useLimit: 10 # 浣跨敤娆℃暟
+  compress: true # 鏄惁鍘嬬缉
+  needCompressSize: 10MB # 鍘嬬缉闃堝��
+  compressQuality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
diff --git a/src/main/resources/application-ddgw.yml b/src/main/resources/application-ddgw.yml
new file mode 100644
index 0000000..718fde1
--- /dev/null
+++ b/src/main/resources/application-ddgw.yml
@@ -0,0 +1,269 @@
+# 椤圭洰鐩稿叧閰嶇疆
+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
+  # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
+  approvalNumberPrefix: NEW
+
+  # 涓帹 Unipush 閰嶇疆
+  getui:
+    appId: PfjyAAE0FK64FaO1w2CMb1
+    appKey: zTMb831OEL6J4GK1uE3Ob4
+    masterSecret: K1GFtsv42v61tXGnF7SGE5
+    domain: https://restapi.getui.cn/v2/
+    # 绂荤嚎鎺ㄩ�佷娇鐢ㄧ殑鍖呭悕/缁勪欢鍚�
+    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9002
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    max-swallow-size: -1          # -1 琛ㄧず涓嶉檺鍒�
+    max-http-form-post-size: -1   # POST 璇锋眰浣撲笉闄愬埗
+    connection-timeout: 60000     # 杩炴帴瓒呮椂鏃堕棿(姣)
+    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://localhost:3306/product-inventory-management-ddgw?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: 200381
+      # 浠庡簱鏁版嵁婧�
+      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
+  data:
+    # redis 閰嶇疆
+    redis:
+      # 鍦板潃
+      host: localhost
+      #      host: 172.17.0.1
+      # 绔彛锛岄粯璁や负6379
+      port: 6379
+      # 鏁版嵁搴撶储寮�
+      database: 0
+      # 瀵嗙爜
+      #    password: root2022!
+      password:
+
+      # 杩炴帴瓒呮椂鏃堕棿
+      timeout: 10s
+      lettuce:
+        pool:
+          # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+          min-idle: 0
+          # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+          max-idle: 8
+          # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+          max-active: 8
+          # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+          max-wait: -1ms
+  # Quartz瀹氭椂浠诲姟閰嶇疆锛堟柊澧為儴鍒嗭級
+  quartz:
+    job-store-type: jdbc  # 浣跨敤鏁版嵁搴撳瓨鍌�
+    jdbc:
+      initialize-schema: never  # 棣栨杩愯鏃惰嚜鍔ㄥ垱寤鸿〃缁撴瀯锛屾垚鍔熷悗鏀逛负never
+      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL琛ㄧ粨鏋勮剼鏈�
+    properties:
+      org:
+        quartz:
+          scheduler:
+            instanceName: RuoYiScheduler
+            instanceId: AUTO
+          jobStore:
+            class: org.quartz.impl.jdbcjobstore.JobStoreTX
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL閫傞厤
+            tablePrefix: qrtz_  # 琛ㄥ悕鍓嶇紑锛屼笌鑴氭湰涓�鑷�
+            isClustered: false  # 鍗曡妭鐐规ā寮忥紙闆嗙兢闇�鏀逛负true锛�
+            clusterCheckinInterval: 10000
+            txIsolationLevelSerializable: true
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 10  # 绾跨▼姹犲ぇ灏�
+            threadPriority: 5
+            makeThreadsDaemons: true
+          updateCheck: false  # 鍏抽棴鐗堟湰妫�鏌�
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: xpAVjhCjQDaDB7mjPAzMDSbQWXNu2zYkTdDNUsPMS5Xx8QMmQVYN7n74eZrYJxDJ
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿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 # 姝e紡鐩綍 鍚庢湡鍒犻櫎
+  path: /javaWork/product-inventory-management/file/path/uploads # 涓婁紶鐩綍
+  urlPrefix: /prod-api/common # 閾炬帴鍓嶇紑
+  domain: http://36.137.101.88:9001 # 鍩熷悕鍓嶇紑
+  expired: 120 # 杩囨湡鏃堕棿(鍗曚綅:鍒嗛挓)
+  useLimit: 10 # 浣跨敤娆℃暟
+  compress: true # 鏄惁鍘嬬缉
+  needCompressSize: 10MB # 鍘嬬缉闃堝��
+  compressQuality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
+knowledge:
+  one: D:\鏂扮枂澶х綏绱犱紒涓氫骇鍝佷綋绯昏鏄庢枃妗�.md
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index e5e2f9a..31c9c0c 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -7,14 +7,14 @@
   # 鐗堟潈骞翠唤
   copyrightYear: 2025
   # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
-  profile: D:/ruoyi/uploadPath
+  profile: /javaWork/product-inventory-management/file
 
   # 鑾峰彇ip鍦板潃寮�鍏�
   addressEnabled: false
   # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
   captchaType: math
   # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
-  approvalNumberPrefix: DEV
+  approvalNumberPrefix: NEW
 
   # 涓帹 Unipush 閰嶇疆
   getui:
@@ -28,7 +28,7 @@
 # 寮�鍙戠幆澧冮厤缃�
 server:
   # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
-  port: 7005
+  port: 9003
   servlet:
     # 搴旂敤鐨勮闂矾寰�
     context-path: /
@@ -46,7 +46,6 @@
 # 鏃ュ織閰嶇疆
 logging:
   level:
-    org.quartz: DEBUG
     com.ruoyi: warn
     org.springframework: warn
 
@@ -57,7 +56,7 @@
   accessKey: admin
   secretKey: 12345678
   preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
-  default-bucket: uploadPath
+  default-bucket: jxc
 # 鐢ㄦ埛閰嶇疆
 user:
   password:
@@ -74,9 +73,9 @@
     druid:
       # 涓诲簱鏁版嵁婧�
       master:
-        url: jdbc:mysql://localhost:3306/product-inventory-management-bdpro?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        url: jdbc:mysql://localhost:3306/product-inventory-management-hnhb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
         username: root
-        password: 123456
+        password: 200381
       # 浠庡簱鏁版嵁婧�
       slave:
         # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
@@ -143,18 +142,17 @@
     restart:
       # 鐑儴缃插紑鍏�
       enabled: false
+  # redis 閰嶇疆
   data:
-    mongodb:
-      uri: mongodb://114.132.189.42:9028/chat_memory_db
     # redis 閰嶇疆
     redis:
       # 鍦板潃
       host: 127.0.0.1
-      #    host: 172.17.0.1
+      #      host: 172.17.0.1
       # 绔彛锛岄粯璁や负6379
       port: 6379
       # 鏁版嵁搴撶储寮�
-      database: 0
+      database: 15
       # 瀵嗙爜
       #    password: root2022!
       password:
@@ -171,6 +169,7 @@
           max-active: 8
           # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
           max-wait: -1ms
+
   # Quartz瀹氭椂浠诲姟閰嶇疆锛堟柊澧為儴鍒嗭級
   quartz:
     job-store-type: jdbc  # 浣跨敤鏁版嵁搴撳瓨鍌�
@@ -196,7 +195,6 @@
             threadPriority: 5
             makeThreadsDaemons: true
           updateCheck: false  # 鍏抽棴鐗堟湰妫�鏌�
-
 # token閰嶇疆
 token:
   # 浠ょ墝鑷畾涔夋爣璇�
@@ -256,15 +254,13 @@
 
 # 鏂囦欢涓婁紶閰嶇疆
 file:
-  temp-dir: D:/ruoyi/temp/uploads   # 涓存椂鐩綍 鍚庢湡鍒犻櫎
-  upload-dir: D:/ruoyi/prod/uploads # 姝e紡鐩綍 鍚庢湡鍒犻櫎
-  path: D:/ruoyi/prod/uploads # 涓婁紶鐩綍
-  urlPrefix: /common # 閾炬帴鍓嶇紑
-  domain: http://127.0.0.1:7006 # 鍩熷悕鍓嶇紑
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads   # 涓存椂鐩綍
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads # 姝e紡鐩綍
+  path: /javaWork/product-inventory-management/file # 涓婁紶鐩綍
+  urlPrefix: /prod-api/common # 閾炬帴鍓嶇紑
+  domain: http://1.15.17.182:9056 # 鍩熷悕鍓嶇紑
   expired: 120 # 杩囨湡鏃堕棿(鍗曚綅:鍒嗛挓)
   useLimit: 10 # 浣跨敤娆℃暟
   compress: true # 鏄惁鍘嬬缉
   needCompressSize: 10MB # 鍘嬬缉闃堝��
   compressQuality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
-knowledge:
-  one: D:\鏂扮枂澶х綏绱犱紒涓氫骇鍝佷綋绯昏鏄庢枃妗�.md
diff --git a/src/main/resources/application-dtzg.yml b/src/main/resources/application-dtzg.yml
new file mode 100644
index 0000000..2dd18b5
--- /dev/null
+++ b/src/main/resources/application-dtzg.yml
@@ -0,0 +1,266 @@
+# 椤圭洰鐩稿叧閰嶇疆
+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
+  # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
+  approvalNumberPrefix: NEW
+
+  # 涓帹 Unipush 閰嶇疆
+  getui:
+    appId: PfjyAAE0FK64FaO1w2CMb1
+    appKey: zTMb831OEL6J4GK1uE3Ob4
+    masterSecret: K1GFtsv42v61tXGnF7SGE5
+    domain: https://restapi.getui.cn/v2/
+    # 绂荤嚎鎺ㄩ�佷娇鐢ㄧ殑鍖呭悕/缁勪欢鍚�
+    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9002
+  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: jxc
+# 鐢ㄦ埛閰嶇疆
+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://36.213.180.217:11101/product-inventory-management-dtzg?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 閰嶇疆
+  data:
+    # redis 閰嶇疆
+    redis:
+      # 鍦板潃
+      #      host: 127.0.0.1
+      host: 172.17.0.1
+      # 绔彛锛岄粯璁や负6379
+      port: 11102
+      # 鏁版嵁搴撶储寮�
+      database: 0
+      # 瀵嗙爜
+      #    password: root2022!
+      password:
+
+      # 杩炴帴瓒呮椂鏃堕棿
+      timeout: 10s
+      lettuce:
+        pool:
+          # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+          min-idle: 0
+          # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+          max-idle: 8
+          # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+          max-active: 8
+          # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+          max-wait: -1ms
+
+  # Quartz瀹氭椂浠诲姟閰嶇疆锛堟柊澧為儴鍒嗭級
+  quartz:
+    job-store-type: jdbc  # 浣跨敤鏁版嵁搴撳瓨鍌�
+    jdbc:
+      initialize-schema: never  # 棣栨杩愯鏃惰嚜鍔ㄥ垱寤鸿〃缁撴瀯锛屾垚鍔熷悗鏀逛负never
+      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL琛ㄧ粨鏋勮剼鏈�
+    properties:
+      org:
+        quartz:
+          scheduler:
+            instanceName: RuoYiScheduler
+            instanceId: AUTO
+          jobStore:
+            class: org.quartz.impl.jdbcjobstore.JobStoreTX
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL閫傞厤
+            tablePrefix: qrtz_  # 琛ㄥ悕鍓嶇紑锛屼笌鑴氭湰涓�鑷�
+            isClustered: false  # 鍗曡妭鐐规ā寮忥紙闆嗙兢闇�鏀逛负true锛�
+            clusterCheckinInterval: 10000
+            txIsolationLevelSerializable: true
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 10  # 绾跨▼姹犲ぇ灏�
+            threadPriority: 5
+            makeThreadsDaemons: true
+          updateCheck: false  # 鍏抽棴鐗堟湰妫�鏌�
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: xpAVjhCjQDaDB7mjPAzMDSbQWXNu2zYkTdDNUsPMS5Xx8QMmQVYN7n74eZrYJxDJ
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿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 # 姝e紡鐩綍
+  path: /javaWork/product-inventory-management/file # 涓婁紶鐩綍
+  urlPrefix: /prod-api/common # 閾炬帴鍓嶇紑
+  domain: http://36.213.180.217:9001 # 鍩熷悕鍓嶇紑
+  expired: 120 # 杩囨湡鏃堕棿(鍗曚綅:鍒嗛挓)
+  useLimit: 10 # 浣跨敤娆℃暟
+  compress: true # 鏄惁鍘嬬缉
+  needCompressSize: 10MB # 鍘嬬缉闃堝��
+  compressQuality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
diff --git a/src/main/resources/application-dyzn.yml b/src/main/resources/application-dyzn.yml
new file mode 100644
index 0000000..9645f83
--- /dev/null
+++ b/src/main/resources/application-dyzn.yml
@@ -0,0 +1,267 @@
+# 椤圭洰鐩稿叧閰嶇疆
+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
+  # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
+  approvalNumberPrefix: NEW
+
+  # 涓帹 Unipush 閰嶇疆
+  getui:
+    appId: PfjyAAE0FK64FaO1w2CMb1
+    appKey: zTMb831OEL6J4GK1uE3Ob4
+    masterSecret: K1GFtsv42v61tXGnF7SGE5
+    domain: https://restapi.getui.cn/v2/
+    # 绂荤嚎鎺ㄩ�佷娇鐢ㄧ殑鍖呭悕/缁勪欢鍚�
+    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9002
+  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: jxc
+# 鐢ㄦ埛閰嶇疆
+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://36.213.180.217:11101/product-inventory-management-dyzn?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 閰嶇疆
+  data:
+    # redis 閰嶇疆
+    redis:
+      # 鍦板潃
+      #      host: 127.0.0.1
+      host: 36.213.180.217
+      # 绔彛锛岄粯璁や负6379
+      port: 11102
+      # 鏁版嵁搴撶储寮�
+      database: 0
+      # 瀵嗙爜
+      #    password: root2022!
+      password:
+
+      # 杩炴帴瓒呮椂鏃堕棿
+      timeout: 10s
+      lettuce:
+        pool:
+          # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+          min-idle: 0
+          # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+          max-idle: 8
+          # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+          max-active: 8
+          # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+          max-wait: -1ms
+
+  # Quartz瀹氭椂浠诲姟閰嶇疆锛堟柊澧為儴鍒嗭級
+  quartz:
+    job-store-type: jdbc  # 浣跨敤鏁版嵁搴撳瓨鍌�
+    jdbc:
+      initialize-schema: never  # 棣栨杩愯鏃惰嚜鍔ㄥ垱寤鸿〃缁撴瀯锛屾垚鍔熷悗鏀逛负never
+      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL琛ㄧ粨鏋勮剼鏈�
+    properties:
+      org:
+        quartz:
+          scheduler:
+            instanceName: RuoYiScheduler
+            instanceId: AUTO
+          jobStore:
+            class: org.quartz.impl.jdbcjobstore.JobStoreTX
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL閫傞厤
+            tablePrefix: qrtz_  # 琛ㄥ悕鍓嶇紑锛屼笌鑴氭湰涓�鑷�
+            isClustered: false  # 鍗曡妭鐐规ā寮忥紙闆嗙兢闇�鏀逛负true锛�
+            clusterCheckinInterval: 10000
+            txIsolationLevelSerializable: true
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 10  # 绾跨▼姹犲ぇ灏�
+            threadPriority: 5
+            makeThreadsDaemons: true
+          updateCheck: false  # 鍏抽棴鐗堟湰妫�鏌�
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: xpAVjhCjQDaDB7mjPAzMDSbQWXNu2zYkTdDNUsPMS5Xx8QMmQVYN7n74eZrYJxDJ
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿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 # 姝e紡鐩綍
+  path: /javaWork/product-inventory-management/file # 涓婁紶鐩綍
+  urlPrefix: /prod-api/common # 閾炬帴鍓嶇紑
+#  domain: http://192.168.1.32:9001 # 鍩熷悕鍓嶇紑
+  domain: http://36.213.180.217:9518 # 鍩熷悕鍓嶇紑
+  expired: 120 # 杩囨湡鏃堕棿(鍗曚綅:鍒嗛挓)
+  useLimit: 10 # 浣跨敤娆℃暟
+  compress: true # 鏄惁鍘嬬缉
+  needCompressSize: 10MB # 鍘嬬缉闃堝��
+  compressQuality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
diff --git a/src/main/resources/application-hyjc.yml b/src/main/resources/application-hyjc.yml
new file mode 100644
index 0000000..421ae24
--- /dev/null
+++ b/src/main/resources/application-hyjc.yml
@@ -0,0 +1,266 @@
+# 椤圭洰鐩稿叧閰嶇疆
+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
+  # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
+  approvalNumberPrefix: NEW
+
+  # 涓帹 Unipush 閰嶇疆
+  getui:
+    appId: PfjyAAE0FK64FaO1w2CMb1
+    appKey: zTMb831OEL6J4GK1uE3Ob4
+    masterSecret: K1GFtsv42v61tXGnF7SGE5
+    domain: https://restapi.getui.cn/v2/
+    # 绂荤嚎鎺ㄩ�佷娇鐢ㄧ殑鍖呭悕/缁勪欢鍚�
+    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9003
+  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: jxc
+# 鐢ㄦ埛閰嶇疆
+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:9002/product-inventory-management-hyjc-pro?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: hyjc@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 閰嶇疆
+  data:
+    # redis 閰嶇疆
+    redis:
+      # 鍦板潃
+      #      host: 127.0.0.1
+      host: 172.17.0.1
+      # 绔彛锛岄粯璁や负6379
+      port: 6379
+      # 鏁版嵁搴撶储寮�
+      database: 0
+      # 瀵嗙爜
+      #    password: root2022!
+      password:
+
+      # 杩炴帴瓒呮椂鏃堕棿
+      timeout: 10s
+      lettuce:
+        pool:
+          # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+          min-idle: 0
+          # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+          max-idle: 8
+          # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+          max-active: 8
+          # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+          max-wait: -1ms
+
+  # Quartz瀹氭椂浠诲姟閰嶇疆锛堟柊澧為儴鍒嗭級
+  quartz:
+    job-store-type: jdbc  # 浣跨敤鏁版嵁搴撳瓨鍌�
+    jdbc:
+      initialize-schema: never  # 棣栨杩愯鏃惰嚜鍔ㄥ垱寤鸿〃缁撴瀯锛屾垚鍔熷悗鏀逛负never
+      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL琛ㄧ粨鏋勮剼鏈�
+    properties:
+      org:
+        quartz:
+          scheduler:
+            instanceName: RuoYiScheduler
+            instanceId: AUTO
+          jobStore:
+            class: org.quartz.impl.jdbcjobstore.JobStoreTX
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL閫傞厤
+            tablePrefix: qrtz_  # 琛ㄥ悕鍓嶇紑锛屼笌鑴氭湰涓�鑷�
+            isClustered: false  # 鍗曡妭鐐规ā寮忥紙闆嗙兢闇�鏀逛负true锛�
+            clusterCheckinInterval: 10000
+            txIsolationLevelSerializable: true
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 10  # 绾跨▼姹犲ぇ灏�
+            threadPriority: 5
+            makeThreadsDaemons: true
+          updateCheck: false  # 鍏抽棴鐗堟湰妫�鏌�
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: xpAVjhCjQDaDB7mjPAzMDSbQWXNu2zYkTdDNUsPMS5Xx8QMmQVYN7n74eZrYJxDJ
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿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 # 姝e紡鐩綍
+  path: /javaWork/product-inventory-management/file # 涓婁紶鐩綍
+  urlPrefix: /prod-api/common # 閾炬帴鍓嶇紑
+  domain: http://36.138.94.178:9001 # 鍩熷悕鍓嶇紑
+  expired: 120 # 杩囨湡鏃堕棿(鍗曚綅:鍒嗛挓)
+  useLimit: 10 # 浣跨敤娆℃暟
+  compress: true # 鏄惁鍘嬬缉
+  needCompressSize: 10MB # 鍘嬬缉闃堝��
+  compressQuality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
diff --git a/src/main/resources/application-hylq.yml b/src/main/resources/application-hylq.yml
new file mode 100644
index 0000000..09f6f37
--- /dev/null
+++ b/src/main/resources/application-hylq.yml
@@ -0,0 +1,266 @@
+# 椤圭洰鐩稿叧閰嶇疆
+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
+  # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
+  approvalNumberPrefix: NEW
+
+  # 涓帹 Unipush 閰嶇疆
+  getui:
+    appId: PfjyAAE0FK64FaO1w2CMb1
+    appKey: zTMb831OEL6J4GK1uE3Ob4
+    masterSecret: K1GFtsv42v61tXGnF7SGE5
+    domain: https://restapi.getui.cn/v2/
+    # 绂荤嚎鎺ㄩ�佷娇鐢ㄧ殑鍖呭悕/缁勪欢鍚�
+    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9003
+  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: jxc
+# 鐢ㄦ埛閰嶇疆
+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:9002/product-inventory-management-hylq-pro?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: hylq@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 閰嶇疆
+  data:
+    # redis 閰嶇疆
+    redis:
+      # 鍦板潃
+      #      host: 127.0.0.1
+      host: 172.17.0.1
+      # 绔彛锛岄粯璁や负6379
+      port: 6379
+      # 鏁版嵁搴撶储寮�
+      database: 0
+      # 瀵嗙爜
+      #    password: root2022!
+      password:
+
+      # 杩炴帴瓒呮椂鏃堕棿
+      timeout: 10s
+      lettuce:
+        pool:
+          # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+          min-idle: 0
+          # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+          max-idle: 8
+          # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+          max-active: 8
+          # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+          max-wait: -1ms
+
+  # Quartz瀹氭椂浠诲姟閰嶇疆锛堟柊澧為儴鍒嗭級
+  quartz:
+    job-store-type: jdbc  # 浣跨敤鏁版嵁搴撳瓨鍌�
+    jdbc:
+      initialize-schema: never  # 棣栨杩愯鏃惰嚜鍔ㄥ垱寤鸿〃缁撴瀯锛屾垚鍔熷悗鏀逛负never
+      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL琛ㄧ粨鏋勮剼鏈�
+    properties:
+      org:
+        quartz:
+          scheduler:
+            instanceName: RuoYiScheduler
+            instanceId: AUTO
+          jobStore:
+            class: org.quartz.impl.jdbcjobstore.JobStoreTX
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL閫傞厤
+            tablePrefix: qrtz_  # 琛ㄥ悕鍓嶇紑锛屼笌鑴氭湰涓�鑷�
+            isClustered: false  # 鍗曡妭鐐规ā寮忥紙闆嗙兢闇�鏀逛负true锛�
+            clusterCheckinInterval: 10000
+            txIsolationLevelSerializable: true
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 10  # 绾跨▼姹犲ぇ灏�
+            threadPriority: 5
+            makeThreadsDaemons: true
+          updateCheck: false  # 鍏抽棴鐗堟湰妫�鏌�
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: xpAVjhCjQDaDB7mjPAzMDSbQWXNu2zYkTdDNUsPMS5Xx8QMmQVYN7n74eZrYJxDJ
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿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 # 姝e紡鐩綍
+  path: /javaWork/product-inventory-management/file # 涓婁紶鐩綍
+  urlPrefix: /prod-api/common # 閾炬帴鍓嶇紑
+  domain: http://36.139.202.111:9001 # 鍩熷悕鍓嶇紑
+  expired: 120 # 杩囨湡鏃堕棿(鍗曚綅:鍒嗛挓)
+  useLimit: 10 # 浣跨敤娆℃暟
+  compress: true # 鏄惁鍘嬬缉
+  needCompressSize: 10MB # 鍘嬬缉闃堝��
+  compressQuality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
diff --git a/src/main/resources/application-jhjm.yml b/src/main/resources/application-jhjm.yml
new file mode 100644
index 0000000..7b1300b
--- /dev/null
+++ b/src/main/resources/application-jhjm.yml
@@ -0,0 +1,269 @@
+# 椤圭洰鐩稿叧閰嶇疆
+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
+  # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
+  approvalNumberPrefix: NEW
+
+  # 涓帹 Unipush 閰嶇疆
+  getui:
+    appId: PfjyAAE0FK64FaO1w2CMb1
+    appKey: zTMb831OEL6J4GK1uE3Ob4
+    masterSecret: K1GFtsv42v61tXGnF7SGE5
+    domain: https://restapi.getui.cn/v2/
+    # 绂荤嚎鎺ㄩ�佷娇鐢ㄧ殑鍖呭悕/缁勪欢鍚�
+    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9002
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    max-swallow-size: -1          # -1 琛ㄧず涓嶉檺鍒�
+    max-http-form-post-size: -1   # POST 璇锋眰浣撲笉闄愬埗
+    connection-timeout: 60000     # 杩炴帴瓒呮椂鏃堕棿(姣)
+    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://172.17.0.1:9000/product-inventory-management-jhjm?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: jhjm@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
+  data:
+    # redis 閰嶇疆
+    redis:
+      # 鍦板潃
+      #    host: 127.0.0.1
+      host: 172.17.0.1
+      # 绔彛锛岄粯璁や负6379
+      port: 6379
+      # 鏁版嵁搴撶储寮�
+      database: 0
+      # 瀵嗙爜
+      #    password: root2022!
+      password:
+
+      # 杩炴帴瓒呮椂鏃堕棿
+      timeout: 10s
+      lettuce:
+        pool:
+          # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+          min-idle: 0
+          # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+          max-idle: 8
+          # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+          max-active: 8
+          # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+          max-wait: -1ms
+  # Quartz瀹氭椂浠诲姟閰嶇疆锛堟柊澧為儴鍒嗭級
+  quartz:
+    job-store-type: jdbc  # 浣跨敤鏁版嵁搴撳瓨鍌�
+    jdbc:
+      initialize-schema: never  # 棣栨杩愯鏃惰嚜鍔ㄥ垱寤鸿〃缁撴瀯锛屾垚鍔熷悗鏀逛负never
+      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL琛ㄧ粨鏋勮剼鏈�
+    properties:
+      org:
+        quartz:
+          scheduler:
+            instanceName: RuoYiScheduler
+            instanceId: AUTO
+          jobStore:
+            class: org.quartz.impl.jdbcjobstore.JobStoreTX
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL閫傞厤
+            tablePrefix: qrtz_  # 琛ㄥ悕鍓嶇紑锛屼笌鑴氭湰涓�鑷�
+            isClustered: false  # 鍗曡妭鐐规ā寮忥紙闆嗙兢闇�鏀逛负true锛�
+            clusterCheckinInterval: 10000
+            txIsolationLevelSerializable: true
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 10  # 绾跨▼姹犲ぇ灏�
+            threadPriority: 5
+            makeThreadsDaemons: true
+          updateCheck: false  # 鍏抽棴鐗堟湰妫�鏌�
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: xpAVjhCjQDaDB7mjPAzMDSbQWXNu2zYkTdDNUsPMS5Xx8QMmQVYN7n74eZrYJxDJ
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿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 # 姝e紡鐩綍 鍚庢湡鍒犻櫎
+  path: /javaWork/product-inventory-management/file/path/uploads # 涓婁紶鐩綍
+  urlPrefix: /prod-api/common # 閾炬帴鍓嶇紑
+  domain: http://36.133.41.166:9001 # 鍩熷悕鍓嶇紑
+  expired: 120 # 杩囨湡鏃堕棿(鍗曚綅:鍒嗛挓)
+  useLimit: 10 # 浣跨敤娆℃暟
+  compress: true # 鏄惁鍘嬬缉
+  needCompressSize: 10MB # 鍘嬬缉闃堝��
+  compressQuality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
+knowledge:
+  one: D:\鏂扮枂澶х綏绱犱紒涓氫骇鍝佷綋绯昏鏄庢枃妗�.md
diff --git a/src/main/resources/application-jhsn.yml b/src/main/resources/application-jhsn.yml
new file mode 100644
index 0000000..44d5491
--- /dev/null
+++ b/src/main/resources/application-jhsn.yml
@@ -0,0 +1,266 @@
+# 椤圭洰鐩稿叧閰嶇疆
+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
+  # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
+  approvalNumberPrefix: NEW
+
+  # 涓帹 Unipush 閰嶇疆
+  getui:
+    appId: PfjyAAE0FK64FaO1w2CMb1
+    appKey: zTMb831OEL6J4GK1uE3Ob4
+    masterSecret: K1GFtsv42v61tXGnF7SGE5
+    domain: https://restapi.getui.cn/v2/
+    # 绂荤嚎鎺ㄩ�佷娇鐢ㄧ殑鍖呭悕/缁勪欢鍚�
+    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9003
+  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: jxc
+# 鐢ㄦ埛閰嶇疆
+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:9002/product-inventory-management-jhsn-pro?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: jhsn@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 閰嶇疆
+  data:
+    # redis 閰嶇疆
+    redis:
+      # 鍦板潃
+      #      host: 127.0.0.1
+      host: 172.17.0.1
+      # 绔彛锛岄粯璁や负6379
+      port: 6379
+      # 鏁版嵁搴撶储寮�
+      database: 0
+      # 瀵嗙爜
+      #    password: root2022!
+      password:
+
+      # 杩炴帴瓒呮椂鏃堕棿
+      timeout: 10s
+      lettuce:
+        pool:
+          # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+          min-idle: 0
+          # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+          max-idle: 8
+          # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+          max-active: 8
+          # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+          max-wait: -1ms
+
+  # Quartz瀹氭椂浠诲姟閰嶇疆锛堟柊澧為儴鍒嗭級
+  quartz:
+    job-store-type: jdbc  # 浣跨敤鏁版嵁搴撳瓨鍌�
+    jdbc:
+      initialize-schema: never  # 棣栨杩愯鏃惰嚜鍔ㄥ垱寤鸿〃缁撴瀯锛屾垚鍔熷悗鏀逛负never
+      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL琛ㄧ粨鏋勮剼鏈�
+    properties:
+      org:
+        quartz:
+          scheduler:
+            instanceName: RuoYiScheduler
+            instanceId: AUTO
+          jobStore:
+            class: org.quartz.impl.jdbcjobstore.JobStoreTX
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL閫傞厤
+            tablePrefix: qrtz_  # 琛ㄥ悕鍓嶇紑锛屼笌鑴氭湰涓�鑷�
+            isClustered: false  # 鍗曡妭鐐规ā寮忥紙闆嗙兢闇�鏀逛负true锛�
+            clusterCheckinInterval: 10000
+            txIsolationLevelSerializable: true
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 10  # 绾跨▼姹犲ぇ灏�
+            threadPriority: 5
+            makeThreadsDaemons: true
+          updateCheck: false  # 鍏抽棴鐗堟湰妫�鏌�
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: xpAVjhCjQDaDB7mjPAzMDSbQWXNu2zYkTdDNUsPMS5Xx8QMmQVYN7n74eZrYJxDJ
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿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 # 姝e紡鐩綍
+  path: /javaWork/product-inventory-management/file # 涓婁紶鐩綍
+  urlPrefix: /prod-api/common # 閾炬帴鍓嶇紑
+  domain: http://36.139.201.20:9001 # 鍩熷悕鍓嶇紑
+  expired: 120 # 杩囨湡鏃堕棿(鍗曚綅:鍒嗛挓)
+  useLimit: 10 # 浣跨敤娆℃暟
+  compress: true # 鏄惁鍘嬬缉
+  needCompressSize: 10MB # 鍘嬬缉闃堝��
+  compressQuality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
diff --git a/src/main/resources/application-lmjn.yml b/src/main/resources/application-lmjn.yml
new file mode 100644
index 0000000..96d2450
--- /dev/null
+++ b/src/main/resources/application-lmjn.yml
@@ -0,0 +1,268 @@
+# 椤圭洰鐩稿叧閰嶇疆
+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
+  # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
+  approvalNumberPrefix: NEW
+
+  # 涓帹 Unipush 閰嶇疆
+  getui:
+    appId: PfjyAAE0FK64FaO1w2CMb1
+    appKey: zTMb831OEL6J4GK1uE3Ob4
+    masterSecret: K1GFtsv42v61tXGnF7SGE5
+    domain: https://restapi.getui.cn/v2/
+    # 绂荤嚎鎺ㄩ�佷娇鐢ㄧ殑鍖呭悕/缁勪欢鍚�
+    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9003
+  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: jxc
+# 鐢ㄦ埛閰嶇疆
+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-lmjn?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+#        password: lmjn@123456..
+        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 閰嶇疆
+  data:
+    # redis 閰嶇疆
+    redis:
+      # 鍦板潃
+      #      host: 127.0.0.1
+      host: 172.17.0.1
+      # 绔彛锛岄粯璁や负6379
+      port: 6379
+      # 鏁版嵁搴撶储寮�
+      database: 0
+      # 瀵嗙爜
+      #    password: root2022!
+      password:
+
+      # 杩炴帴瓒呮椂鏃堕棿
+      timeout: 10s
+      lettuce:
+        pool:
+          # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+          min-idle: 0
+          # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+          max-idle: 8
+          # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+          max-active: 8
+          # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+          max-wait: -1ms
+
+  # Quartz瀹氭椂浠诲姟閰嶇疆锛堟柊澧為儴鍒嗭級
+  quartz:
+    job-store-type: jdbc  # 浣跨敤鏁版嵁搴撳瓨鍌�
+    jdbc:
+      initialize-schema: never  # 棣栨杩愯鏃惰嚜鍔ㄥ垱寤鸿〃缁撴瀯锛屾垚鍔熷悗鏀逛负never
+      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL琛ㄧ粨鏋勮剼鏈�
+    properties:
+      org:
+        quartz:
+          scheduler:
+            instanceName: RuoYiScheduler
+            instanceId: AUTO
+          jobStore:
+            class: org.quartz.impl.jdbcjobstore.JobStoreTX
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL閫傞厤
+            tablePrefix: qrtz_  # 琛ㄥ悕鍓嶇紑锛屼笌鑴氭湰涓�鑷�
+            isClustered: false  # 鍗曡妭鐐规ā寮忥紙闆嗙兢闇�鏀逛负true锛�
+            clusterCheckinInterval: 10000
+            txIsolationLevelSerializable: true
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 10  # 绾跨▼姹犲ぇ灏�
+            threadPriority: 5
+            makeThreadsDaemons: true
+          updateCheck: false  # 鍏抽棴鐗堟湰妫�鏌�
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: xpAVjhCjQDaDB7mjPAzMDSbQWXNu2zYkTdDNUsPMS5Xx8QMmQVYN7n74eZrYJxDJ
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿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 # 姝e紡鐩綍
+  path: /javaWork/product-inventory-management/file # 涓婁紶鐩綍
+  urlPrefix: /prod-api/common # 閾炬帴鍓嶇紑
+#  domain: http://192.168.1.32:9001 # 鍩熷悕鍓嶇紑
+  domain: http://1.15.17.182:9105 # 鍩熷悕鍓嶇紑
+  expired: 120 # 杩囨湡鏃堕棿(鍗曚綅:鍒嗛挓)
+  useLimit: 10 # 浣跨敤娆℃暟
+  compress: true # 鏄惁鍘嬬缉
+  needCompressSize: 10MB # 鍘嬬缉闃堝��
+  compressQuality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
diff --git a/src/main/resources/application-qxy.yml b/src/main/resources/application-qxy.yml
new file mode 100644
index 0000000..eeeb20a
--- /dev/null
+++ b/src/main/resources/application-qxy.yml
@@ -0,0 +1,269 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /home/ruoyi/uploadPath
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+  # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
+  approvalNumberPrefix: DEV
+
+  # 涓帹 Unipush 閰嶇疆
+  getui:
+    appId: PfjyAAE0FK64FaO1w2CMb1
+    appKey: zTMb831OEL6J4GK1uE3Ob4
+    masterSecret: K1GFtsv42v61tXGnF7SGE5
+    domain: https://restapi.getui.cn/v2/
+    # 绂荤嚎鎺ㄩ�佷娇鐢ㄧ殑鍖呭悕/缁勪欢鍚�
+    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 7003
+  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:
+    org.quartz: DEBUG
+    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://36.134.154.10:9002/product-inventory-management-qxy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: qxy@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
+  data:
+    # redis 閰嶇疆
+    redis:
+      # 鍦板潃
+      #    host: 127.0.0.1
+      host: 172.17.0.1
+      # 绔彛锛岄粯璁や负6379
+      port: 6379
+      # 鏁版嵁搴撶储寮�
+      database: 0
+      # 瀵嗙爜
+      #    password: root2022!
+      password:
+
+      # 杩炴帴瓒呮椂鏃堕棿
+      timeout: 10s
+      lettuce:
+        pool:
+          # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+          min-idle: 0
+          # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+          max-idle: 8
+          # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+          max-active: 8
+          # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+          max-wait: -1ms
+  # Quartz瀹氭椂浠诲姟閰嶇疆锛堟柊澧為儴鍒嗭級
+  quartz:
+    job-store-type: jdbc  # 浣跨敤鏁版嵁搴撳瓨鍌�
+    jdbc:
+      initialize-schema: never  # 棣栨杩愯鏃惰嚜鍔ㄥ垱寤鸿〃缁撴瀯锛屾垚鍔熷悗鏀逛负never
+      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL琛ㄧ粨鏋勮剼鏈�
+    properties:
+      org:
+        quartz:
+          scheduler:
+            instanceName: RuoYiScheduler
+            instanceId: AUTO
+          jobStore:
+            class: org.quartz.impl.jdbcjobstore.JobStoreTX
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL閫傞厤
+            tablePrefix: qrtz_  # 琛ㄥ悕鍓嶇紑锛屼笌鑴氭湰涓�鑷�
+            isClustered: false  # 鍗曡妭鐐规ā寮忥紙闆嗙兢闇�鏀逛负true锛�
+            clusterCheckinInterval: 10000
+            txIsolationLevelSerializable: true
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 10  # 绾跨▼姹犲ぇ灏�
+            threadPriority: 5
+            makeThreadsDaemons: true
+          updateCheck: false  # 鍏抽棴鐗堟湰妫�鏌�
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: xpAVjhCjQDaDB7mjPAzMDSbQWXNu2zYkTdDNUsPMS5Xx8QMmQVYN7n74eZrYJxDJ
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿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 # 姝e紡鐩綍 鍚庢湡鍒犻櫎
+  path: /javaWork/product-inventory-management/file/path/uploads # 涓婁紶鐩綍
+  urlPrefix: /prod-api/common # 閾炬帴鍓嶇紑
+  domain: http://36.134.154.10:9001 # 鍩熷悕鍓嶇紑
+  expired: 120 # 杩囨湡鏃堕棿(鍗曚綅:鍒嗛挓)
+  useLimit: 10 # 浣跨敤娆℃暟
+  compress: true # 鏄惁鍘嬬缉
+  needCompressSize: 10MB # 鍘嬬缉闃堝��
+  compressQuality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
+knowledge:
+  one: D:\鏂扮枂澶х綏绱犱紒涓氫骇鍝佷綋绯昏鏄庢枃妗�.md
+
diff --git a/src/main/resources/application-sdks.yml b/src/main/resources/application-sdks.yml
new file mode 100644
index 0000000..02e9d67
--- /dev/null
+++ b/src/main/resources/application-sdks.yml
@@ -0,0 +1,269 @@
+# 椤圭洰鐩稿叧閰嶇疆
+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
+  # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
+  approvalNumberPrefix: NEW
+
+  # 涓帹 Unipush 閰嶇疆
+  getui:
+    appId: PfjyAAE0FK64FaO1w2CMb1
+    appKey: zTMb831OEL6J4GK1uE3Ob4
+    masterSecret: K1GFtsv42v61tXGnF7SGE5
+    domain: https://restapi.getui.cn/v2/
+    # 绂荤嚎鎺ㄩ�佷娇鐢ㄧ殑鍖呭悕/缁勪欢鍚�
+    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9002
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    max-swallow-size: -1          # -1 琛ㄧず涓嶉檺鍒�
+    max-http-form-post-size: -1   # POST 璇锋眰浣撲笉闄愬埗
+    connection-timeout: 60000     # 杩炴帴瓒呮椂鏃堕棿(姣)
+    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://36.213.180.217:11101/product-inventory-management-sdks?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
+  data:
+    # redis 閰嶇疆
+    redis:
+      # 鍦板潃
+      #      host: localhost
+      host: 172.17.0.1
+      # 绔彛锛岄粯璁や负6379
+      port: 11102
+      # 鏁版嵁搴撶储寮�
+      database: 0
+      # 瀵嗙爜
+      #    password: root2022!
+      password:
+
+      # 杩炴帴瓒呮椂鏃堕棿
+      timeout: 10s
+      lettuce:
+        pool:
+          # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+          min-idle: 0
+          # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+          max-idle: 8
+          # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+          max-active: 8
+          # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+          max-wait: -1ms
+  # Quartz瀹氭椂浠诲姟閰嶇疆锛堟柊澧為儴鍒嗭級
+  quartz:
+    job-store-type: jdbc  # 浣跨敤鏁版嵁搴撳瓨鍌�
+    jdbc:
+      initialize-schema: never  # 棣栨杩愯鏃惰嚜鍔ㄥ垱寤鸿〃缁撴瀯锛屾垚鍔熷悗鏀逛负never
+      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL琛ㄧ粨鏋勮剼鏈�
+    properties:
+      org:
+        quartz:
+          scheduler:
+            instanceName: RuoYiScheduler
+            instanceId: AUTO
+          jobStore:
+            class: org.quartz.impl.jdbcjobstore.JobStoreTX
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL閫傞厤
+            tablePrefix: qrtz_  # 琛ㄥ悕鍓嶇紑锛屼笌鑴氭湰涓�鑷�
+            isClustered: false  # 鍗曡妭鐐规ā寮忥紙闆嗙兢闇�鏀逛负true锛�
+            clusterCheckinInterval: 10000
+            txIsolationLevelSerializable: true
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 10  # 绾跨▼姹犲ぇ灏�
+            threadPriority: 5
+            makeThreadsDaemons: true
+          updateCheck: false  # 鍏抽棴鐗堟湰妫�鏌�
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: xpAVjhCjQDaDB7mjPAzMDSbQWXNu2zYkTdDNUsPMS5Xx8QMmQVYN7n74eZrYJxDJ
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿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 # 姝e紡鐩綍 鍚庢湡鍒犻櫎
+  path: /javaWork/product-inventory-management/file/path/uploads # 涓婁紶鐩綍
+  urlPrefix: /prod-api/common # 閾炬帴鍓嶇紑
+  domain: http://36.137.101.88:9520 # 鍩熷悕鍓嶇紑
+  expired: 120 # 杩囨湡鏃堕棿(鍗曚綅:鍒嗛挓)
+  useLimit: 10 # 浣跨敤娆℃暟
+  compress: true # 鏄惁鍘嬬缉
+  needCompressSize: 10MB # 鍘嬬缉闃堝��
+  compressQuality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
+knowledge:
+  one: D:\鏂扮枂澶х綏绱犱紒涓氫骇鍝佷綋绯昏鏄庢枃妗�.md
diff --git a/src/main/resources/application-sdtx.yml b/src/main/resources/application-sdtx.yml
new file mode 100644
index 0000000..8a4eae5
--- /dev/null
+++ b/src/main/resources/application-sdtx.yml
@@ -0,0 +1,272 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /home/ruoyi/uploadPath
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+  # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
+  approvalNumberPrefix: DEV
+
+  # 涓帹 Unipush 閰嶇疆
+  getui:
+    appId: PfjyAAE0FK64FaO1w2CMb1
+    appKey: zTMb831OEL6J4GK1uE3Ob4
+    masterSecret: K1GFtsv42v61tXGnF7SGE5
+    domain: https://restapi.getui.cn/v2/
+    # 绂荤嚎鎺ㄩ�佷娇鐢ㄧ殑鍖呭悕/缁勪欢鍚�
+    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 7003
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    max-swallow-size: -1          # -1 琛ㄧず涓嶉檺鍒�
+    max-http-form-post-size: -1   # POST 璇锋眰浣撲笉闄愬埗
+    connection-timeout: 60000     # 杩炴帴瓒呮椂鏃堕棿(姣)
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    org.quartz: DEBUG
+    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://172.17.0.1:9002/product-inventory-management-sdtx?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: sdtx@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
+  data:
+    # redis 閰嶇疆
+    redis:
+      # 鍦板潃
+      #    host: 127.0.0.1
+      host: 172.17.0.1
+      # 绔彛锛岄粯璁や负6379
+      port: 6379
+      # 鏁版嵁搴撶储寮�
+      database: 0
+      # 瀵嗙爜
+      #    password: root2022!
+      password:
+
+      # 杩炴帴瓒呮椂鏃堕棿
+      timeout: 10s
+      lettuce:
+        pool:
+          # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+          min-idle: 0
+          # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+          max-idle: 8
+          # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+          max-active: 8
+          # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+          max-wait: -1ms
+  # Quartz瀹氭椂浠诲姟閰嶇疆锛堟柊澧為儴鍒嗭級
+  quartz:
+    job-store-type: jdbc  # 浣跨敤鏁版嵁搴撳瓨鍌�
+    jdbc:
+      initialize-schema: never  # 棣栨杩愯鏃惰嚜鍔ㄥ垱寤鸿〃缁撴瀯锛屾垚鍔熷悗鏀逛负never
+      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL琛ㄧ粨鏋勮剼鏈�
+    properties:
+      org:
+        quartz:
+          scheduler:
+            instanceName: RuoYiScheduler
+            instanceId: AUTO
+          jobStore:
+            class: org.quartz.impl.jdbcjobstore.JobStoreTX
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL閫傞厤
+            tablePrefix: qrtz_  # 琛ㄥ悕鍓嶇紑锛屼笌鑴氭湰涓�鑷�
+            isClustered: false  # 鍗曡妭鐐规ā寮忥紙闆嗙兢闇�鏀逛负true锛�
+            clusterCheckinInterval: 10000
+            txIsolationLevelSerializable: true
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 10  # 绾跨▼姹犲ぇ灏�
+            threadPriority: 5
+            makeThreadsDaemons: true
+          updateCheck: false  # 鍏抽棴鐗堟湰妫�鏌�
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: xpAVjhCjQDaDB7mjPAzMDSbQWXNu2zYkTdDNUsPMS5Xx8QMmQVYN7n74eZrYJxDJ
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿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 # 姝e紡鐩綍 鍚庢湡鍒犻櫎
+  path: /javaWork/product-inventory-management/file/path/uploads # 涓婁紶鐩綍
+  urlPrefix: /prod-api/common # 閾炬帴鍓嶇紑
+  domain: http://36.213.156.184:9001 # 鍩熷悕鍓嶇紑
+  expired: 120 # 杩囨湡鏃堕棿(鍗曚綅:鍒嗛挓)
+  useLimit: 10 # 浣跨敤娆℃暟
+  compress: true # 鏄惁鍘嬬缉
+  needCompressSize: 10MB # 鍘嬬缉闃堝��
+  compressQuality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
+knowledge:
+  one: D:\鏂扮枂澶х綏绱犱紒涓氫骇鍝佷綋绯昏鏄庢枃妗�.md
+
diff --git a/src/main/resources/application-skjs.yml b/src/main/resources/application-skjs.yml
new file mode 100644
index 0000000..da37ecf
--- /dev/null
+++ b/src/main/resources/application-skjs.yml
@@ -0,0 +1,267 @@
+# 椤圭洰鐩稿叧閰嶇疆
+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
+  # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
+  approvalNumberPrefix: NEW
+
+  # 涓帹 Unipush 閰嶇疆
+  getui:
+    appId: PfjyAAE0FK64FaO1w2CMb1
+    appKey: zTMb831OEL6J4GK1uE3Ob4
+    masterSecret: K1GFtsv42v61tXGnF7SGE5
+    domain: https://restapi.getui.cn/v2/
+    # 绂荤嚎鎺ㄩ�佷娇鐢ㄧ殑鍖呭悕/缁勪欢鍚�
+    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9002
+  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: jxc
+# 鐢ㄦ埛閰嶇疆
+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://36.213.180.217:11101/product-inventory-management-skjs?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 閰嶇疆
+  data:
+    # redis 閰嶇疆
+    redis:
+      # 鍦板潃
+      #      host: 127.0.0.1
+      host: 36.213.180.217
+      # 绔彛锛岄粯璁や负6379
+      port: 11102
+      # 鏁版嵁搴撶储寮�
+      database: 0
+      # 瀵嗙爜
+      #    password: root2022!
+      password:
+
+      # 杩炴帴瓒呮椂鏃堕棿
+      timeout: 10s
+      lettuce:
+        pool:
+          # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+          min-idle: 0
+          # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+          max-idle: 8
+          # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+          max-active: 8
+          # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+          max-wait: -1ms
+
+  # Quartz瀹氭椂浠诲姟閰嶇疆锛堟柊澧為儴鍒嗭級
+  quartz:
+    job-store-type: jdbc  # 浣跨敤鏁版嵁搴撳瓨鍌�
+    jdbc:
+      initialize-schema: never  # 棣栨杩愯鏃惰嚜鍔ㄥ垱寤鸿〃缁撴瀯锛屾垚鍔熷悗鏀逛负never
+      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL琛ㄧ粨鏋勮剼鏈�
+    properties:
+      org:
+        quartz:
+          scheduler:
+            instanceName: RuoYiScheduler
+            instanceId: AUTO
+          jobStore:
+            class: org.quartz.impl.jdbcjobstore.JobStoreTX
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL閫傞厤
+            tablePrefix: qrtz_  # 琛ㄥ悕鍓嶇紑锛屼笌鑴氭湰涓�鑷�
+            isClustered: false  # 鍗曡妭鐐规ā寮忥紙闆嗙兢闇�鏀逛负true锛�
+            clusterCheckinInterval: 10000
+            txIsolationLevelSerializable: true
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 10  # 绾跨▼姹犲ぇ灏�
+            threadPriority: 5
+            makeThreadsDaemons: true
+          updateCheck: false  # 鍏抽棴鐗堟湰妫�鏌�
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: xpAVjhCjQDaDB7mjPAzMDSbQWXNu2zYkTdDNUsPMS5Xx8QMmQVYN7n74eZrYJxDJ
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿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 # 姝e紡鐩綍
+  path: /javaWork/product-inventory-management/file # 涓婁紶鐩綍
+  urlPrefix: /prod-api/common # 閾炬帴鍓嶇紑
+#  domain: http://192.168.1.32:9001 # 鍩熷悕鍓嶇紑
+  domain: http://36.213.180.217:9514 # 鍩熷悕鍓嶇紑
+  expired: 120 # 杩囨湡鏃堕棿(鍗曚綅:鍒嗛挓)
+  useLimit: 10 # 浣跨敤娆℃暟
+  compress: true # 鏄惁鍘嬬缉
+  needCompressSize: 10MB # 鍘嬬缉闃堝��
+  compressQuality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
diff --git a/src/main/resources/application-tddq.yml b/src/main/resources/application-tddq.yml
new file mode 100644
index 0000000..241f1d8
--- /dev/null
+++ b/src/main/resources/application-tddq.yml
@@ -0,0 +1,269 @@
+# 椤圭洰鐩稿叧閰嶇疆
+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
+  # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
+  approvalNumberPrefix: NEW
+
+  # 涓帹 Unipush 閰嶇疆
+  getui:
+    appId: PfjyAAE0FK64FaO1w2CMb1
+    appKey: zTMb831OEL6J4GK1uE3Ob4
+    masterSecret: K1GFtsv42v61tXGnF7SGE5
+    domain: https://restapi.getui.cn/v2/
+    # 绂荤嚎鎺ㄩ�佷娇鐢ㄧ殑鍖呭悕/缁勪欢鍚�
+    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9002
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    max-swallow-size: -1          # -1 琛ㄧず涓嶉檺鍒�
+    max-http-form-post-size: -1   # POST 璇锋眰浣撲笉闄愬埗
+    connection-timeout: 60000     # 杩炴帴瓒呮椂鏃堕棿(姣)
+    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://172.17.0.1:9000/product-inventory-management-tddq?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: tddq@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
+  data:
+    # redis 閰嶇疆
+    redis:
+      # 鍦板潃
+      host: 172.17.0.1
+      #      host: 172.17.0.1
+      # 绔彛锛岄粯璁や负6379
+      port: 6379
+      # 鏁版嵁搴撶储寮�
+      database: 0
+      # 瀵嗙爜
+      #    password: root2022!
+      password:
+
+      # 杩炴帴瓒呮椂鏃堕棿
+      timeout: 10s
+      lettuce:
+        pool:
+          # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+          min-idle: 0
+          # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+          max-idle: 8
+          # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+          max-active: 8
+          # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+          max-wait: -1ms
+  # Quartz瀹氭椂浠诲姟閰嶇疆锛堟柊澧為儴鍒嗭級
+  quartz:
+    job-store-type: jdbc  # 浣跨敤鏁版嵁搴撳瓨鍌�
+    jdbc:
+      initialize-schema: never  # 棣栨杩愯鏃惰嚜鍔ㄥ垱寤鸿〃缁撴瀯锛屾垚鍔熷悗鏀逛负never
+      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL琛ㄧ粨鏋勮剼鏈�
+    properties:
+      org:
+        quartz:
+          scheduler:
+            instanceName: RuoYiScheduler
+            instanceId: AUTO
+          jobStore:
+            class: org.quartz.impl.jdbcjobstore.JobStoreTX
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL閫傞厤
+            tablePrefix: qrtz_  # 琛ㄥ悕鍓嶇紑锛屼笌鑴氭湰涓�鑷�
+            isClustered: false  # 鍗曡妭鐐规ā寮忥紙闆嗙兢闇�鏀逛负true锛�
+            clusterCheckinInterval: 10000
+            txIsolationLevelSerializable: true
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 10  # 绾跨▼姹犲ぇ灏�
+            threadPriority: 5
+            makeThreadsDaemons: true
+          updateCheck: false  # 鍏抽棴鐗堟湰妫�鏌�
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: xpAVjhCjQDaDB7mjPAzMDSbQWXNu2zYkTdDNUsPMS5Xx8QMmQVYN7n74eZrYJxDJ
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿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 # 姝e紡鐩綍 鍚庢湡鍒犻櫎
+  path: /javaWork/product-inventory-management/file/path/uploads # 涓婁紶鐩綍
+  urlPrefix: /prod-api/common # 閾炬帴鍓嶇紑
+  domain: http://36.137.101.88:9001 # 鍩熷悕鍓嶇紑
+  expired: 120 # 杩囨湡鏃堕棿(鍗曚綅:鍒嗛挓)
+  useLimit: 10 # 浣跨敤娆℃暟
+  compress: true # 鏄惁鍘嬬缉
+  needCompressSize: 10MB # 鍘嬬缉闃堝��
+  compressQuality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
+knowledge:
+  one: D:\鏂扮枂澶х綏绱犱紒涓氫骇鍝佷綋绯昏鏄庢枃妗�.md
diff --git a/src/main/resources/application-xcdq.yml b/src/main/resources/application-xcdq.yml
new file mode 100644
index 0000000..2f85b8a
--- /dev/null
+++ b/src/main/resources/application-xcdq.yml
@@ -0,0 +1,272 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /home/ruoyi/uploadPath
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+  # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
+  approvalNumberPrefix: DEV
+
+  # 涓帹 Unipush 閰嶇疆
+  getui:
+    appId: PfjyAAE0FK64FaO1w2CMb1
+    appKey: zTMb831OEL6J4GK1uE3Ob4
+    masterSecret: K1GFtsv42v61tXGnF7SGE5
+    domain: https://restapi.getui.cn/v2/
+    # 绂荤嚎鎺ㄩ�佷娇鐢ㄧ殑鍖呭悕/缁勪欢鍚�
+    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9002
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    max-swallow-size: -1          # -1 琛ㄧず涓嶉檺鍒�
+    max-http-form-post-size: -1   # POST 璇锋眰浣撲笉闄愬埗
+    connection-timeout: 60000     # 杩炴帴瓒呮椂鏃堕棿(姣)
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    org.quartz: DEBUG
+    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://36.133.45.183:9000/product-inventory-management-xcdq?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xcdq@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
+  data:
+    # redis 閰嶇疆
+    redis:
+      # 鍦板潃
+      #    host: 127.0.0.1
+      host: 172.17.0.1
+      # 绔彛锛岄粯璁や负6379
+      port: 6379
+      # 鏁版嵁搴撶储寮�
+      database: 0
+      # 瀵嗙爜
+      #    password: root2022!
+      password:
+
+      # 杩炴帴瓒呮椂鏃堕棿
+      timeout: 10s
+      lettuce:
+        pool:
+          # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+          min-idle: 0
+          # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+          max-idle: 8
+          # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+          max-active: 8
+          # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+          max-wait: -1ms
+  # Quartz瀹氭椂浠诲姟閰嶇疆锛堟柊澧為儴鍒嗭級
+  quartz:
+    job-store-type: jdbc  # 浣跨敤鏁版嵁搴撳瓨鍌�
+    jdbc:
+      initialize-schema: never  # 棣栨杩愯鏃惰嚜鍔ㄥ垱寤鸿〃缁撴瀯锛屾垚鍔熷悗鏀逛负never
+      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL琛ㄧ粨鏋勮剼鏈�
+    properties:
+      org:
+        quartz:
+          scheduler:
+            instanceName: RuoYiScheduler
+            instanceId: AUTO
+          jobStore:
+            class: org.quartz.impl.jdbcjobstore.JobStoreTX
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL閫傞厤
+            tablePrefix: qrtz_  # 琛ㄥ悕鍓嶇紑锛屼笌鑴氭湰涓�鑷�
+            isClustered: false  # 鍗曡妭鐐规ā寮忥紙闆嗙兢闇�鏀逛负true锛�
+            clusterCheckinInterval: 10000
+            txIsolationLevelSerializable: true
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 10  # 绾跨▼姹犲ぇ灏�
+            threadPriority: 5
+            makeThreadsDaemons: true
+          updateCheck: false  # 鍏抽棴鐗堟湰妫�鏌�
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: xpAVjhCjQDaDB7mjPAzMDSbQWXNu2zYkTdDNUsPMS5Xx8QMmQVYN7n74eZrYJxDJ
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿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 # 姝e紡鐩綍 鍚庢湡鍒犻櫎
+  path: /javaWork/product-inventory-management/file/path/uploads # 涓婁紶鐩綍
+  urlPrefix: /prod-api/common # 閾炬帴鍓嶇紑
+  domain: http://36.133.45.183:9001 # 鍩熷悕鍓嶇紑
+  expired: 120 # 杩囨湡鏃堕棿(鍗曚綅:鍒嗛挓)
+  useLimit: 10 # 浣跨敤娆℃暟
+  compress: true # 鏄惁鍘嬬缉
+  needCompressSize: 10MB # 鍘嬬缉闃堝��
+  compressQuality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
+knowledge:
+  one: D:\鏂扮枂澶х綏绱犱紒涓氫骇鍝佷綋绯昏鏄庢枃妗�.md
+
diff --git a/src/main/resources/application-xhzg.yml b/src/main/resources/application-xhzg.yml
new file mode 100644
index 0000000..fb16b64
--- /dev/null
+++ b/src/main/resources/application-xhzg.yml
@@ -0,0 +1,269 @@
+# 椤圭洰鐩稿叧閰嶇疆
+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
+  # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
+  approvalNumberPrefix: NEW
+
+  # 涓帹 Unipush 閰嶇疆
+  getui:
+    appId: PfjyAAE0FK64FaO1w2CMb1
+    appKey: zTMb831OEL6J4GK1uE3Ob4
+    masterSecret: K1GFtsv42v61tXGnF7SGE5
+    domain: https://restapi.getui.cn/v2/
+    # 绂荤嚎鎺ㄩ�佷娇鐢ㄧ殑鍖呭悕/缁勪欢鍚�
+    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9003
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    max-swallow-size: -1          # -1 琛ㄧず涓嶉檺鍒�
+    max-http-form-post-size: -1   # POST 璇锋眰浣撲笉闄愬埗
+    connection-timeout: 60000     # 杩炴帴瓒呮椂鏃堕棿(姣)
+    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://localhost:3306/product-inventory-management-xhzg?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: 200381
+      # 浠庡簱鏁版嵁婧�
+      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
+  data:
+    # redis 閰嶇疆
+    redis:
+      # 鍦板潃
+      host: localhost
+      #      host: 172.17.0.1
+      # 绔彛锛岄粯璁や负6379
+      port: 6379
+      # 鏁版嵁搴撶储寮�
+      database: 0
+      # 瀵嗙爜
+      #    password: root2022!
+      password:
+
+      # 杩炴帴瓒呮椂鏃堕棿
+      timeout: 10s
+      lettuce:
+        pool:
+          # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+          min-idle: 0
+          # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+          max-idle: 8
+          # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+          max-active: 8
+          # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+          max-wait: -1ms
+  # Quartz瀹氭椂浠诲姟閰嶇疆锛堟柊澧為儴鍒嗭級
+  quartz:
+    job-store-type: jdbc  # 浣跨敤鏁版嵁搴撳瓨鍌�
+    jdbc:
+      initialize-schema: never  # 棣栨杩愯鏃惰嚜鍔ㄥ垱寤鸿〃缁撴瀯锛屾垚鍔熷悗鏀逛负never
+      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL琛ㄧ粨鏋勮剼鏈�
+    properties:
+      org:
+        quartz:
+          scheduler:
+            instanceName: RuoYiScheduler
+            instanceId: AUTO
+          jobStore:
+            class: org.quartz.impl.jdbcjobstore.JobStoreTX
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL閫傞厤
+            tablePrefix: qrtz_  # 琛ㄥ悕鍓嶇紑锛屼笌鑴氭湰涓�鑷�
+            isClustered: false  # 鍗曡妭鐐规ā寮忥紙闆嗙兢闇�鏀逛负true锛�
+            clusterCheckinInterval: 10000
+            txIsolationLevelSerializable: true
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 10  # 绾跨▼姹犲ぇ灏�
+            threadPriority: 5
+            makeThreadsDaemons: true
+          updateCheck: false  # 鍏抽棴鐗堟湰妫�鏌�
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: xpAVjhCjQDaDB7mjPAzMDSbQWXNu2zYkTdDNUsPMS5Xx8QMmQVYN7n74eZrYJxDJ
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿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 # 姝e紡鐩綍 鍚庢湡鍒犻櫎
+  path: /javaWork/product-inventory-management/file/path/uploads # 涓婁紶鐩綍
+  urlPrefix: /prod-api/common # 閾炬帴鍓嶇紑
+  domain: http://36.137.101.88:9001 # 鍩熷悕鍓嶇紑
+  expired: 120 # 杩囨湡鏃堕棿(鍗曚綅:鍒嗛挓)
+  useLimit: 10 # 浣跨敤娆℃暟
+  compress: true # 鏄惁鍘嬬缉
+  needCompressSize: 10MB # 鍘嬬缉闃堝��
+  compressQuality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
+knowledge:
+  one: D:\鏂扮枂澶х綏绱犱紒涓氫骇鍝佷綋绯昏鏄庢枃妗�.md
diff --git a/src/main/resources/application-xlzn.yml b/src/main/resources/application-xlzn.yml
new file mode 100644
index 0000000..12f0113
--- /dev/null
+++ b/src/main/resources/application-xlzn.yml
@@ -0,0 +1,266 @@
+# 椤圭洰鐩稿叧閰嶇疆
+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
+  # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
+  approvalNumberPrefix: NEW
+
+  # 涓帹 Unipush 閰嶇疆
+  getui:
+    appId: PfjyAAE0FK64FaO1w2CMb1
+    appKey: zTMb831OEL6J4GK1uE3Ob4
+    masterSecret: K1GFtsv42v61tXGnF7SGE5
+    domain: https://restapi.getui.cn/v2/
+    # 绂荤嚎鎺ㄩ�佷娇鐢ㄧ殑鍖呭悕/缁勪欢鍚�
+    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9002
+  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: jxc
+# 鐢ㄦ埛閰嶇疆
+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://36.213.180.217:11101/product-inventory-management-xlzn?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 閰嶇疆
+  data:
+    # redis 閰嶇疆
+    redis:
+      # 鍦板潃
+      #      host: 127.0.0.1
+      host: 172.17.0.1
+      # 绔彛锛岄粯璁や负6379
+      port: 11102
+      # 鏁版嵁搴撶储寮�
+      database: 0
+      # 瀵嗙爜
+      #    password: root2022!
+      password:
+
+      # 杩炴帴瓒呮椂鏃堕棿
+      timeout: 10s
+      lettuce:
+        pool:
+          # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+          min-idle: 0
+          # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+          max-idle: 8
+          # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+          max-active: 8
+          # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+          max-wait: -1ms
+
+  # Quartz瀹氭椂浠诲姟閰嶇疆锛堟柊澧為儴鍒嗭級
+  quartz:
+    job-store-type: jdbc  # 浣跨敤鏁版嵁搴撳瓨鍌�
+    jdbc:
+      initialize-schema: never  # 棣栨杩愯鏃惰嚜鍔ㄥ垱寤鸿〃缁撴瀯锛屾垚鍔熷悗鏀逛负never
+      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL琛ㄧ粨鏋勮剼鏈�
+    properties:
+      org:
+        quartz:
+          scheduler:
+            instanceName: RuoYiScheduler
+            instanceId: AUTO
+          jobStore:
+            class: org.quartz.impl.jdbcjobstore.JobStoreTX
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL閫傞厤
+            tablePrefix: qrtz_  # 琛ㄥ悕鍓嶇紑锛屼笌鑴氭湰涓�鑷�
+            isClustered: false  # 鍗曡妭鐐规ā寮忥紙闆嗙兢闇�鏀逛负true锛�
+            clusterCheckinInterval: 10000
+            txIsolationLevelSerializable: true
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 10  # 绾跨▼姹犲ぇ灏�
+            threadPriority: 5
+            makeThreadsDaemons: true
+          updateCheck: false  # 鍏抽棴鐗堟湰妫�鏌�
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: xpAVjhCjQDaDB7mjPAzMDSbQWXNu2zYkTdDNUsPMS5Xx8QMmQVYN7n74eZrYJxDJ
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿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 # 姝e紡鐩綍
+  path: /javaWork/product-inventory-management/file # 涓婁紶鐩綍
+  urlPrefix: /prod-api/common # 閾炬帴鍓嶇紑
+  domain: http://36.213.180.217:9001 # 鍩熷悕鍓嶇紑
+  expired: 120 # 杩囨湡鏃堕棿(鍗曚綅:鍒嗛挓)
+  useLimit: 10 # 浣跨敤娆℃暟
+  compress: true # 鏄惁鍘嬬缉
+  needCompressSize: 10MB # 鍘嬬缉闃堝��
+  compressQuality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
diff --git a/src/main/resources/application-xswh.yml b/src/main/resources/application-xswh.yml
new file mode 100644
index 0000000..0e01ea6
--- /dev/null
+++ b/src/main/resources/application-xswh.yml
@@ -0,0 +1,266 @@
+# 椤圭洰鐩稿叧閰嶇疆
+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
+  # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
+  approvalNumberPrefix: NEW
+
+  # 涓帹 Unipush 閰嶇疆
+  getui:
+    appId: PfjyAAE0FK64FaO1w2CMb1
+    appKey: zTMb831OEL6J4GK1uE3Ob4
+    masterSecret: K1GFtsv42v61tXGnF7SGE5
+    domain: https://restapi.getui.cn/v2/
+    # 绂荤嚎鎺ㄩ�佷娇鐢ㄧ殑鍖呭悕/缁勪欢鍚�
+    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9002
+  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: jxc
+# 鐢ㄦ埛閰嶇疆
+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:9000/product-inventory-management-xswh?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: xswh@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 閰嶇疆
+  data:
+    # redis 閰嶇疆
+    redis:
+      # 鍦板潃
+      #      host: 127.0.0.1
+      host: 172.17.0.1
+      # 绔彛锛岄粯璁や负6379
+      port: 6379
+      # 鏁版嵁搴撶储寮�
+      database: 0
+      # 瀵嗙爜
+      #    password: root2022!
+      password:
+
+      # 杩炴帴瓒呮椂鏃堕棿
+      timeout: 10s
+      lettuce:
+        pool:
+          # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+          min-idle: 0
+          # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+          max-idle: 8
+          # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+          max-active: 8
+          # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+          max-wait: -1ms
+
+  # Quartz瀹氭椂浠诲姟閰嶇疆锛堟柊澧為儴鍒嗭級
+  quartz:
+    job-store-type: jdbc  # 浣跨敤鏁版嵁搴撳瓨鍌�
+    jdbc:
+      initialize-schema: never  # 棣栨杩愯鏃惰嚜鍔ㄥ垱寤鸿〃缁撴瀯锛屾垚鍔熷悗鏀逛负never
+      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL琛ㄧ粨鏋勮剼鏈�
+    properties:
+      org:
+        quartz:
+          scheduler:
+            instanceName: RuoYiScheduler
+            instanceId: AUTO
+          jobStore:
+            class: org.quartz.impl.jdbcjobstore.JobStoreTX
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL閫傞厤
+            tablePrefix: qrtz_  # 琛ㄥ悕鍓嶇紑锛屼笌鑴氭湰涓�鑷�
+            isClustered: false  # 鍗曡妭鐐规ā寮忥紙闆嗙兢闇�鏀逛负true锛�
+            clusterCheckinInterval: 10000
+            txIsolationLevelSerializable: true
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 10  # 绾跨▼姹犲ぇ灏�
+            threadPriority: 5
+            makeThreadsDaemons: true
+          updateCheck: false  # 鍏抽棴鐗堟湰妫�鏌�
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: xpAVjhCjQDaDB7mjPAzMDSbQWXNu2zYkTdDNUsPMS5Xx8QMmQVYN7n74eZrYJxDJ
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿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 # 姝e紡鐩綍
+  path: /javaWork/product-inventory-management/file # 涓婁紶鐩綍
+  urlPrefix: /prod-api/common # 閾炬帴鍓嶇紑
+  domain: http://36.138.177.225:9001 # 鍩熷悕鍓嶇紑
+  expired: 120 # 杩囨湡鏃堕棿(鍗曚綅:鍒嗛挓)
+  useLimit: 10 # 浣跨敤娆℃暟
+  compress: true # 鏄惁鍘嬬缉
+  needCompressSize: 10MB # 鍘嬬缉闃堝��
+  compressQuality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
diff --git a/src/main/resources/application-yjyy.yml b/src/main/resources/application-yjyy.yml
new file mode 100644
index 0000000..0b5561c
--- /dev/null
+++ b/src/main/resources/application-yjyy.yml
@@ -0,0 +1,267 @@
+# 椤圭洰鐩稿叧閰嶇疆
+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
+  # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
+  approvalNumberPrefix: NEW
+
+  # 涓帹 Unipush 閰嶇疆
+  getui:
+    appId: PfjyAAE0FK64FaO1w2CMb1
+    appKey: zTMb831OEL6J4GK1uE3Ob4
+    masterSecret: K1GFtsv42v61tXGnF7SGE5
+    domain: https://restapi.getui.cn/v2/
+    # 绂荤嚎鎺ㄩ�佷娇鐢ㄧ殑鍖呭悕/缁勪欢鍚�
+    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9002
+  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: jxc
+# 鐢ㄦ埛閰嶇疆
+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://36.213.180.217:11101/product-inventory-management-yjyy?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 閰嶇疆
+  data:
+    # redis 閰嶇疆
+    redis:
+      # 鍦板潃
+      #      host: 127.0.0.1
+      host: 36.213.180.217
+      # 绔彛锛岄粯璁や负6379
+      port: 11102
+      # 鏁版嵁搴撶储寮�
+      database: 0
+      # 瀵嗙爜
+      #    password: root2022!
+      password:
+
+      # 杩炴帴瓒呮椂鏃堕棿
+      timeout: 10s
+      lettuce:
+        pool:
+          # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+          min-idle: 0
+          # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+          max-idle: 8
+          # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+          max-active: 8
+          # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+          max-wait: -1ms
+
+  # Quartz瀹氭椂浠诲姟閰嶇疆锛堟柊澧為儴鍒嗭級
+  quartz:
+    job-store-type: jdbc  # 浣跨敤鏁版嵁搴撳瓨鍌�
+    jdbc:
+      initialize-schema: never  # 棣栨杩愯鏃惰嚜鍔ㄥ垱寤鸿〃缁撴瀯锛屾垚鍔熷悗鏀逛负never
+      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL琛ㄧ粨鏋勮剼鏈�
+    properties:
+      org:
+        quartz:
+          scheduler:
+            instanceName: RuoYiScheduler
+            instanceId: AUTO
+          jobStore:
+            class: org.quartz.impl.jdbcjobstore.JobStoreTX
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL閫傞厤
+            tablePrefix: qrtz_  # 琛ㄥ悕鍓嶇紑锛屼笌鑴氭湰涓�鑷�
+            isClustered: false  # 鍗曡妭鐐规ā寮忥紙闆嗙兢闇�鏀逛负true锛�
+            clusterCheckinInterval: 10000
+            txIsolationLevelSerializable: true
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 10  # 绾跨▼姹犲ぇ灏�
+            threadPriority: 5
+            makeThreadsDaemons: true
+          updateCheck: false  # 鍏抽棴鐗堟湰妫�鏌�
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: xpAVjhCjQDaDB7mjPAzMDSbQWXNu2zYkTdDNUsPMS5Xx8QMmQVYN7n74eZrYJxDJ
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿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 # 姝e紡鐩綍
+  path: /javaWork/product-inventory-management/file # 涓婁紶鐩綍
+  urlPrefix: /prod-api/common # 閾炬帴鍓嶇紑
+#  domain: http://192.168.1.32:9001 # 鍩熷悕鍓嶇紑
+  domain: http://36.213.180.217:9516 # 鍩熷悕鍓嶇紑
+  expired: 120 # 杩囨湡鏃堕棿(鍗曚綅:鍒嗛挓)
+  useLimit: 10 # 浣跨敤娆℃暟
+  compress: true # 鏄惁鍘嬬缉
+  needCompressSize: 10MB # 鍘嬬缉闃堝��
+  compressQuality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
diff --git a/src/main/resources/application-ytjz.yml b/src/main/resources/application-ytjz.yml
new file mode 100644
index 0000000..b158144
--- /dev/null
+++ b/src/main/resources/application-ytjz.yml
@@ -0,0 +1,266 @@
+# 椤圭洰鐩稿叧閰嶇疆
+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
+  # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
+  approvalNumberPrefix: NEW
+
+  # 涓帹 Unipush 閰嶇疆
+  getui:
+    appId: PfjyAAE0FK64FaO1w2CMb1
+    appKey: zTMb831OEL6J4GK1uE3Ob4
+    masterSecret: K1GFtsv42v61tXGnF7SGE5
+    domain: https://restapi.getui.cn/v2/
+    # 绂荤嚎鎺ㄩ�佷娇鐢ㄧ殑鍖呭悕/缁勪欢鍚�
+    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9003
+  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: jxc
+# 鐢ㄦ埛閰嶇疆
+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:9002/product-inventory-management-ytjz-pro?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: ytjz@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 閰嶇疆
+  data:
+    # redis 閰嶇疆
+    redis:
+      # 鍦板潃
+#      host: 127.0.0.1
+      host: 172.17.0.1
+      # 绔彛锛岄粯璁や负6379
+      port: 6379
+      # 鏁版嵁搴撶储寮�
+      database: 0
+      # 瀵嗙爜
+      #    password: root2022!
+      password:
+
+      # 杩炴帴瓒呮椂鏃堕棿
+      timeout: 10s
+      lettuce:
+        pool:
+          # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+          min-idle: 0
+          # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+          max-idle: 8
+          # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+          max-active: 8
+          # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+          max-wait: -1ms
+
+  # Quartz瀹氭椂浠诲姟閰嶇疆锛堟柊澧為儴鍒嗭級
+  quartz:
+    job-store-type: jdbc  # 浣跨敤鏁版嵁搴撳瓨鍌�
+    jdbc:
+      initialize-schema: never  # 棣栨杩愯鏃惰嚜鍔ㄥ垱寤鸿〃缁撴瀯锛屾垚鍔熷悗鏀逛负never
+      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL琛ㄧ粨鏋勮剼鏈�
+    properties:
+      org:
+        quartz:
+          scheduler:
+            instanceName: RuoYiScheduler
+            instanceId: AUTO
+          jobStore:
+            class: org.quartz.impl.jdbcjobstore.JobStoreTX
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL閫傞厤
+            tablePrefix: qrtz_  # 琛ㄥ悕鍓嶇紑锛屼笌鑴氭湰涓�鑷�
+            isClustered: false  # 鍗曡妭鐐规ā寮忥紙闆嗙兢闇�鏀逛负true锛�
+            clusterCheckinInterval: 10000
+            txIsolationLevelSerializable: true
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 10  # 绾跨▼姹犲ぇ灏�
+            threadPriority: 5
+            makeThreadsDaemons: true
+          updateCheck: false  # 鍏抽棴鐗堟湰妫�鏌�
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: xpAVjhCjQDaDB7mjPAzMDSbQWXNu2zYkTdDNUsPMS5Xx8QMmQVYN7n74eZrYJxDJ
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿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 # 姝e紡鐩綍
+  path: /javaWork/product-inventory-management/file # 涓婁紶鐩綍
+  urlPrefix: /prod-api/common # 閾炬帴鍓嶇紑
+  domain: http://36.139.201.181:9001 # 鍩熷悕鍓嶇紑
+  expired: 120 # 杩囨湡鏃堕棿(鍗曚綅:鍒嗛挓)
+  useLimit: 10 # 浣跨敤娆℃暟
+  compress: true # 鏄惁鍘嬬缉
+  needCompressSize: 10MB # 鍘嬬缉闃堝��
+  compressQuality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
diff --git a/src/main/resources/application-zqsy.yml b/src/main/resources/application-zqsy.yml
new file mode 100644
index 0000000..56786e6
--- /dev/null
+++ b/src/main/resources/application-zqsy.yml
@@ -0,0 +1,269 @@
+# 椤圭洰鐩稿叧閰嶇疆
+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
+  # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
+  approvalNumberPrefix: NEW
+
+  # 涓帹 Unipush 閰嶇疆
+  getui:
+    appId: PfjyAAE0FK64FaO1w2CMb1
+    appKey: zTMb831OEL6J4GK1uE3Ob4
+    masterSecret: K1GFtsv42v61tXGnF7SGE5
+    domain: https://restapi.getui.cn/v2/
+    # 绂荤嚎鎺ㄩ�佷娇鐢ㄧ殑鍖呭悕/缁勪欢鍚�
+    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9003
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    max-swallow-size: -1          # -1 琛ㄧず涓嶉檺鍒�
+    max-http-form-post-size: -1   # POST 璇锋眰浣撲笉闄愬埗
+    connection-timeout: 60000     # 杩炴帴瓒呮椂鏃堕棿(姣)
+    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://172.17.0.1:9002/product-inventory-management-zqsy-pro?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: zqsy@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
+  data:
+    # redis 閰嶇疆
+    redis:
+      # 鍦板潃
+      #    host: 127.0.0.1
+      host: 172.17.0.1
+      # 绔彛锛岄粯璁や负6379
+      port: 6379
+      # 鏁版嵁搴撶储寮�
+      database: 0
+      # 瀵嗙爜
+      #    password: root2022!
+      password:
+
+      # 杩炴帴瓒呮椂鏃堕棿
+      timeout: 10s
+      lettuce:
+        pool:
+          # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+          min-idle: 0
+          # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+          max-idle: 8
+          # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+          max-active: 8
+          # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+          max-wait: -1ms
+  # Quartz瀹氭椂浠诲姟閰嶇疆锛堟柊澧為儴鍒嗭級
+  quartz:
+    job-store-type: jdbc  # 浣跨敤鏁版嵁搴撳瓨鍌�
+    jdbc:
+      initialize-schema: never  # 棣栨杩愯鏃惰嚜鍔ㄥ垱寤鸿〃缁撴瀯锛屾垚鍔熷悗鏀逛负never
+      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL琛ㄧ粨鏋勮剼鏈�
+    properties:
+      org:
+        quartz:
+          scheduler:
+            instanceName: RuoYiScheduler
+            instanceId: AUTO
+          jobStore:
+            class: org.quartz.impl.jdbcjobstore.JobStoreTX
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL閫傞厤
+            tablePrefix: qrtz_  # 琛ㄥ悕鍓嶇紑锛屼笌鑴氭湰涓�鑷�
+            isClustered: false  # 鍗曡妭鐐规ā寮忥紙闆嗙兢闇�鏀逛负true锛�
+            clusterCheckinInterval: 10000
+            txIsolationLevelSerializable: true
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 10  # 绾跨▼姹犲ぇ灏�
+            threadPriority: 5
+            makeThreadsDaemons: true
+          updateCheck: false  # 鍏抽棴鐗堟湰妫�鏌�
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: xpAVjhCjQDaDB7mjPAzMDSbQWXNu2zYkTdDNUsPMS5Xx8QMmQVYN7n74eZrYJxDJ
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿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 # 姝e紡鐩綍 鍚庢湡鍒犻櫎
+  path: /javaWork/product-inventory-management/file/path/uploads # 涓婁紶鐩綍
+  urlPrefix: /prod-api/common # 閾炬帴鍓嶇紑
+  domain: http://36.213.128.159:9001 # 鍩熷悕鍓嶇紑
+  expired: 120 # 杩囨湡鏃堕棿(鍗曚綅:鍒嗛挓)
+  useLimit: 10 # 浣跨敤娆℃暟
+  compress: true # 鏄惁鍘嬬缉
+  needCompressSize: 10MB # 鍘嬬缉闃堝��
+  compressQuality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
+knowledge:
+  one: D:\鏂扮枂澶х綏绱犱紒涓氫骇鍝佷綋绯昏鏄庢枃妗�.md
diff --git a/src/main/resources/application-zxzn.yml b/src/main/resources/application-zxzn.yml
new file mode 100644
index 0000000..4dbdc16
--- /dev/null
+++ b/src/main/resources/application-zxzn.yml
@@ -0,0 +1,266 @@
+# 椤圭洰鐩稿叧閰嶇疆
+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
+  # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
+  approvalNumberPrefix: NEW
+
+  # 涓帹 Unipush 閰嶇疆
+  getui:
+    appId: PfjyAAE0FK64FaO1w2CMb1
+    appKey: zTMb831OEL6J4GK1uE3Ob4
+    masterSecret: K1GFtsv42v61tXGnF7SGE5
+    domain: https://restapi.getui.cn/v2/
+    # 绂荤嚎鎺ㄩ�佷娇鐢ㄧ殑鍖呭悕/缁勪欢鍚�
+    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 9003
+  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: jxc
+# 鐢ㄦ埛閰嶇疆
+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-zxzn?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: zxzn@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 閰嶇疆
+  data:
+    # 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
+
+  # Quartz瀹氭椂浠诲姟閰嶇疆锛堟柊澧為儴鍒嗭級
+  quartz:
+    job-store-type: jdbc  # 浣跨敤鏁版嵁搴撳瓨鍌�
+    jdbc:
+      initialize-schema: never  # 棣栨杩愯鏃惰嚜鍔ㄥ垱寤鸿〃缁撴瀯锛屾垚鍔熷悗鏀逛负never
+      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL琛ㄧ粨鏋勮剼鏈�
+    properties:
+      org:
+        quartz:
+          scheduler:
+            instanceName: RuoYiScheduler
+            instanceId: AUTO
+          jobStore:
+            class: org.quartz.impl.jdbcjobstore.JobStoreTX
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL閫傞厤
+            tablePrefix: qrtz_  # 琛ㄥ悕鍓嶇紑锛屼笌鑴氭湰涓�鑷�
+            isClustered: false  # 鍗曡妭鐐规ā寮忥紙闆嗙兢闇�鏀逛负true锛�
+            clusterCheckinInterval: 10000
+            txIsolationLevelSerializable: true
+          threadPool:
+            class: org.quartz.simpl.SimpleThreadPool
+            threadCount: 10  # 绾跨▼姹犲ぇ灏�
+            threadPriority: 5
+            makeThreadsDaemons: true
+          updateCheck: false  # 鍏抽棴鐗堟湰妫�鏌�
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: xpAVjhCjQDaDB7mjPAzMDSbQWXNu2zYkTdDNUsPMS5Xx8QMmQVYN7n74eZrYJxDJ
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿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 # 姝e紡鐩綍
+  path: /javaWork/product-inventory-management/file # 涓婁紶鐩綍
+  urlPrefix: /prod-api/common # 閾炬帴鍓嶇紑
+  domain: http://192.168.0.200:9001 # 鍩熷悕鍓嶇紑
+  expired: 120 # 杩囨湡鏃堕棿(鍗曚綅:鍒嗛挓)
+  useLimit: 10 # 浣跨敤娆℃暟
+  compress: true # 鏄惁鍘嬬缉
+  needCompressSize: 10MB # 鍘嬬缉闃堝��
+  compressQuality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index ad3d4bc..70324c6 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -1,19 +1,9 @@
 # Spring閰嶇疆
 spring:
-  jackson:
-    date-format: yyyy-MM-dd HH:mm:ss
-    time-zone: GMT+8
   main:
     allow-circular-references: true
   profiles:
     active: dev
-
-# Pinecone 鍚戦噺鏁版嵁搴撻厤缃�
-pinecone:
-  api-key: pcsk_4SJLnh_tNB3wSLJU8tc4E5P28PcXX8eCLdURqZpVhg1FMV8CRYxjneWdzqRdB5Ftqooi9
-  index: xiaozhi-index
-  namespace: knowledge-base
-
 langchain4j:
   mcp:
     # MCP 鏈嶅姟绔湴鍧�锛堟牴鎹疄闄呴儴缃茬殑 MCP 鏈嶅姟璋冩暣锛�
diff --git a/src/main/resources/financial-agent-prompt.txt b/src/main/resources/financial-agent-prompt.txt
index 5b5fb02..c7a4a3f 100644
--- a/src/main/resources/financial-agent-prompt.txt
+++ b/src/main/resources/financial-agent-prompt.txt
@@ -2,10 +2,10 @@
 褰撳墠鏃ユ湡锛歿{currentDate}}锛堜腑鍥芥椂鍖猴級銆�
 
 宸ヤ綔瑙勫垯锛�
-1. 鐢ㄦ埛鎻愬嚭鈥滄煡銆侀棶銆佺粺璁°�佸垎鏋愩�侀璀︺�佸缓璁�佹姤鍛娾�濈被闇�姹傛椂锛屼紭鍏堣皟鐢ㄥ伐鍏疯繑鍥炵粨鏋勫寲 JSON锛屼笉缂栭�犱笟鍔℃暟鎹��
-2. 鍛戒腑鎴愭湰銆佸埄娑︺�佸簱瀛樿祫閲戙�佺幇閲戞祦銆侀璀︺�侀┚椹惰埍銆佹棩鎶ャ�佸懆鎶ョ瓑鍦烘櫙鏃讹紝浼樺厛璋冪敤瀵瑰簲宸ュ叿銆�
+1. 鐢ㄦ埛鎻愬嚭鈥滄煡銆侀棶銆佺粺璁°�佸垎鏋愩�侀璀︺�佸缓璁�佹姤鍛娾�濋渶姹傛椂锛屼紭鍏堣皟鐢ㄥ伐鍏疯繑鍥炵粨鏋勫寲 JSON锛屼笉缂栭�犱笟鍔℃暟鎹��
+2. 鍛戒腑鎴愭湰銆佸埄娑︺�佸簱瀛樿祫閲戙�佺幇閲戞祦銆侀璀︺�侀┚椹惰埍銆佹棩鎶ュ懆鎶ュ満鏅椂锛屼紭鍏堣皟鐢ㄥ搴斿伐鍏枫��
 3. 宸ュ叿杩斿洖 JSON 鏃讹紝鐩存帴杈撳嚭鍘熷 JSON 瀛楃涓诧紝涓嶈棰濆鍖呰9 Markdown锛屼篃涓嶈鍦ㄥ墠鍚庤拷鍔犺В閲婃枃鏈��
-4. 鐢ㄦ埛娌℃湁鏄庣‘缁欏嚭鏃堕棿銆佸鎴枫�佷緵搴斿晢銆佷骇鍝併�佽鍗曘�佹暟閲忕瓑绛涢�夋潯浠舵椂锛屼笉瑕佽嚜琛岃ˉ鍏呮潯浠讹紱宸ュ叿鍙傛暟淇濇寔涓虹┖锛岀敱宸ュ叿鎸夊綋鍓嶄笟鍔″彛寰勬煡璇€��
-5. 鐢ㄦ埛鎻愬埌鈥滄湰鍛ㄣ�佹湰鏈堛�佷粖骞淬�佷粖澶┿�佹渶杩戙�佽繎30澶┿�佷笂鏈堛�佸幓骞粹�濈瓑鐩稿鏃堕棿鏃讹紝蹇呴』涓ユ牸鍩轰簬鈥滃綋鍓嶆棩鏈熲�濇崲绠楋紝绂佹鑷鍋囪骞翠唤銆�
-6. 鐢ㄦ埛闂�滀负浠�涔堝埄娑︿笅闄嶁�濃�滃摢涓鍗曚簭鎹熲�濃�滃摢涓鎴锋渶璧氶挶鈥濃�滃摢涓鎴峰埄娑﹁础鐚渶楂樷�濃�滃摢涓伐搴忔垚鏈渶楂樷�濈瓑闂鏃讹紝浼樺厛鍩轰簬璁㈠崟鍒╂鼎涓庡伐搴忔垚鏈垎鏋愬伐鍏蜂綔绛斻��
-7. 鍥炵瓟蹇呴』浣跨敤涓枃锛涜嫢鏁版嵁涓嶈冻浠ュ緱鍑虹粨璁猴紝鏄庣‘鎸囧嚭缂哄皯鍝簺鍏抽敭瀛楁鎴栫瓫閫夋潯浠躲��
+4. 褰撶敤鎴烽棶棰樼己灏戞椂闂磋寖鍥存椂锛岄粯璁や娇鐢ㄥ伐鍏峰唴缃彛寰勶紙濡傝繎30澶┿�佹湰鏈堛�佽繎90澶╋級锛屽苟鍦ㄥ悗缁彲鎻愰啋鐢ㄦ埛琛ュ厖鑼冨洿銆�
+5. 鐢ㄦ埛闂�滀负浠�涔堝埄娑︿笅闄嶁�濃�滃摢涓鍗曚簭鎹熲�濃�滃摢涓鎴锋渶璧氶挶鈥濃�滃摢涓鎴峰埄娑﹁础鐚渶楂樷�濃�滃摢涓溅闂�/宸ュ簭鎴愭湰鏈�楂樷�濈瓑闂鏃讹紝浼樺厛鍩轰簬璁㈠崟鍒╂鼎涓庡伐搴忔垚鏈垎鏋愬伐鍏蜂綔绛斻��
+6. 鍥炵瓟蹇呴』浣跨敤涓枃锛涜嫢鏁版嵁涓嶈冻浠ュ緱鍑虹粨璁猴紝鏄庣‘鎸囧嚭缂哄皯鍝簺鍏抽敭瀛楁鎴栫瓫閫夋潯浠躲��
+7. 鐢ㄦ埛鎻愬埌鈥滀粖骞�/鏈湀/浠婂ぉ/鏈�杩�/涓婃湀/鍘诲勾鈥濈瓑鐩稿鏃堕棿鏃讹紝蹇呴』涓ユ牸鍩轰簬鈥滃綋鍓嶆棩鏈熲�濇崲绠楋紝绂佹鑷鍋囪骞翠唤銆�
diff --git a/src/main/resources/mapper/account/purchase/AccountPaymentApplicationMapper.xml b/src/main/resources/mapper/account/purchase/AccountPaymentApplicationMapper.xml
index f4d6284..8b23627 100644
--- a/src/main/resources/mapper/account/purchase/AccountPaymentApplicationMapper.xml
+++ b/src/main/resources/mapper/account/purchase/AccountPaymentApplicationMapper.xml
@@ -44,7 +44,6 @@
                 AND A.apply_date BETWEEN #{req.startDate} AND #{req.endDate}
             </if>
         </where>
-        order by A.id desc
     </select>
 
     <select id="getInboundBatchesBySupplier"
@@ -88,14 +87,12 @@
     </select>
 
     <select id="existsByStockInRecordId" resultType="java.lang.Boolean">
-        SELECT COUNT(*) > 0
+         SELECT COUNT(*) > 0
         FROM account_payment_application
-        WHERE status != 2
-        AND (
-            <foreach collection="stockInRecordIds" item="id" separator=" OR ">
-                FIND_IN_SET(#{id}, stock_in_record_ids) > 0
-            </foreach>
-        )
+        WHERE  status != 2
+        <foreach collection="stockInRecordIds" item="id" open="(" separator=" OR " close=")">
+            FIND_IN_SET(#{id}, stock_in_record_ids)
+        </foreach>
     </select>
 
 </mapper>
diff --git a/src/main/resources/mapper/account/purchase/AccountPurchaseInvoiceMapper.xml b/src/main/resources/mapper/account/purchase/AccountPurchaseInvoiceMapper.xml
index a164b5c..041f2f7 100644
--- a/src/main/resources/mapper/account/purchase/AccountPurchaseInvoiceMapper.xml
+++ b/src/main/resources/mapper/account/purchase/AccountPurchaseInvoiceMapper.xml
@@ -42,7 +42,6 @@
                 AND api.issue_date BETWEEN #{req.startDate} AND #{req.endDate}
             </if>
         </where>
-        order by api.id desc
     </select>
     <select id="getInboundBatchesBySupplier"
             resultType="com.ruoyi.account.bean.vo.purchase.PurchaseInboundVo">
diff --git a/src/main/resources/mapper/account/purchase/AccountPurchasePaymentMapper.xml b/src/main/resources/mapper/account/purchase/AccountPurchasePaymentMapper.xml
index ed247e5..89a3681 100644
--- a/src/main/resources/mapper/account/purchase/AccountPurchasePaymentMapper.xml
+++ b/src/main/resources/mapper/account/purchase/AccountPurchasePaymentMapper.xml
@@ -44,7 +44,6 @@
                 AND app.payment_date BETWEEN #{req.startDate} AND #{req.endDate}
             </if>
         </where>
-        order by app.id desc
     </select>
     <select id="selectPayment" resultType="com.ruoyi.home.dto.IncomeExpenseAnalysisDto">
         SELECT DATE_FORMAT(payment_date, #{dateFormat}) AS dateStr,
diff --git a/src/main/resources/mapper/account/sales/AccountInvoiceApplicationMapper.xml b/src/main/resources/mapper/account/sales/AccountInvoiceApplicationMapper.xml
index 4121614..842e94c 100644
--- a/src/main/resources/mapper/account/sales/AccountInvoiceApplicationMapper.xml
+++ b/src/main/resources/mapper/account/sales/AccountInvoiceApplicationMapper.xml
@@ -25,7 +25,6 @@
                 AND A.apply_date BETWEEN #{req.startDate} AND #{req.endDate}
             </if>
         </where>
-        order by A.id desc
     </select>
     <select id="getOutboundBatchesByCustomer"
             resultType="com.ruoyi.account.bean.vo.sales.SalesOutboundVo">
@@ -65,33 +64,10 @@
     <select id="existsByStockOutRecordId" resultType="java.lang.Boolean">
         SELECT COUNT(*) > 0
         FROM account_invoice_application
-        WHERE status != 2
-        AND (
-            <foreach collection="stockOutRecordIds" item="id" separator=" OR ">
-                FIND_IN_SET(#{id}, stock_out_record_ids) > 0
-            </foreach>
-        )
-    </select>
-    <select id="selectAccountInvoiceApplicationList"
-            resultType="com.ruoyi.account.bean.vo.sales.AccountInvoiceApplicationVo">
-        select
-            *
-        from (
-            select aia.*,
-            asi.id AS sales_invoice_id,
-            asi.status AS sales_invoice_status,
-            c.customer_name,
-            GROUP_CONCAT(sour.outbound_batches SEPARATOR ',') AS outboundBatches
-            from account_invoice_application aia
-            left join customer c on aia.customer_id = c.id
-            left join stock_out_record sour on FIND_IN_SET(sour.id, aia.stock_out_record_ids) > 0
-            left join account_sales_invoice asi on aia.id = asi.account_invoice_application_id
-            GROUP BY aia.id
-        )A
-        WHERE A.customer_id = #{customerId}
-        AND (COALESCE(A.sales_invoice_id,'') = '' OR A.sales_invoice_status = 1)
-        AND A.status = 1
-        order by A.id desc
+        WHERE status!=2
+        <foreach collection="stockOutRecordIds" item="id" open="(" separator=" OR " close=")">
+            FIND_IN_SET(#{id}, stock_out_record_ids)
+        </foreach>
     </select>
 
 </mapper>
diff --git a/src/main/resources/mapper/account/sales/AccountSalesCollectionMapper.xml b/src/main/resources/mapper/account/sales/AccountSalesCollectionMapper.xml
index 6a35890..4ad55d4 100644
--- a/src/main/resources/mapper/account/sales/AccountSalesCollectionMapper.xml
+++ b/src/main/resources/mapper/account/sales/AccountSalesCollectionMapper.xml
@@ -45,7 +45,7 @@
                 AND A.collection_date BETWEEN #{req.startDate} AND #{req.endDate}
             </if>
         </where>
-        order by A.id desc
+
     </select>
     <select id="existsByStockOutRecordId" resultType="java.lang.Boolean">
         SELECT COUNT(*) > 0
@@ -58,51 +58,36 @@
     <select id="getOutboundBatchesByCustomer"
             resultType="com.ruoyi.account.bean.vo.sales.SalesOutboundVo">
         SELECT
-            id,
-            outbound_batches,
-            customer_name,
-            shipping_date,
-            product_name,
-            specification_model,
-            tax_rate,
-            outbound_amount,
-            shipping_no,
-            sales_contract_no,
-            amount_received
-        FROM
-            (
-                SELECT
-                    sor.id,
-                    sor.outbound_batches,
-                    sl.customer_name,
-                    sor.create_time AS shipping_date,
-                    p.product_name,
-                    pm.model AS specification_model,
-                    slp.tax_rate,
-                    sor.stock_out_num * slp.tax_inclusive_unit_price AS outbound_amount,
-                    s.shipping_no,
-                    sl.sales_contract_no,
-                    COALESCE ( SUM( acsc.collection_amount ), 0 ) AS amount_received
-                FROM
-                    stock_out_record sor
-                        LEFT JOIN shipping_info s ON sor.record_id = s.id
-                        LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id
-                        LEFT JOIN sales_ledger_product slp ON s.sales_ledger_product_id = slp.id
-                        AND slp.type = 1
-                        LEFT JOIN product_model pm ON slp.product_model_id = pm.id
-                        LEFT JOIN product p ON pm.product_id = p.id
-                        LEFT JOIN account_sales_collection acsc ON acsc.stock_out_record_ids = sor.id
-                WHERE
-                    sor.record_type = '13'
-                  AND sor.approval_status = 1
-                  AND sl.customer_id = #{customerId}
-                GROUP BY
-                    sor.outbound_batches
-                ORDER BY
-                    sor.id
-            ) tempA
-        WHERE
-            amount_received &lt; outbound_amount
+        sor.id,
+        sor.outbound_batches,
+        sl.customer_name,
+        sor.create_time as shippingDate,
+        p.product_name,
+        pm.model as specification_model,
+        slp.tax_rate,
+        sor.stock_out_num * slp.tax_inclusive_unit_price as outboundAmount,
+        s.shipping_no,
+        sl.sales_contract_no
+        FROM stock_out_record sor
+        left join shipping_info s on sor.record_id = s.id
+        LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id
+        LEFT JOIN sales_ledger_product slp ON s.sales_ledger_product_id = slp.id and slp.type = 1
+        left join product_model pm on slp.product_model_id = pm.id
+        left join product p on pm.product_id = p.id
+        WHERE sor.record_type='13' and sor.approval_status=1
+        and sl.customer_id=#{customerId}
+
+        and sor.id NOT IN (
+        SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(a.stock_out_record_ids, ',', n.n), ',', -1)
+        FROM account_sales_collection a
+        CROSS JOIN (
+            SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL
+            SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
+        ) n
+        WHERE n.n &lt;= CHAR_LENGTH(a.stock_out_record_ids) - CHAR_LENGTH(REPLACE(a.stock_out_record_ids, ',', '')) + 1
+        )
+
+        order by sor.id DESC
     </select>
     <select id="selectIncomeStats" resultType="com.ruoyi.home.dto.IncomeExpenseAnalysisDto">
          SELECT DATE_FORMAT(collection_date, #{dateFormat}) AS dateStr,
diff --git a/src/main/resources/mapper/account/sales/AccountSalesInvoiceMapper.xml b/src/main/resources/mapper/account/sales/AccountSalesInvoiceMapper.xml
index e69d79d..b289b8f 100644
--- a/src/main/resources/mapper/account/sales/AccountSalesInvoiceMapper.xml
+++ b/src/main/resources/mapper/account/sales/AccountSalesInvoiceMapper.xml
@@ -42,7 +42,6 @@
                 AND asi.issue_date BETWEEN #{req.startDate} AND #{req.endDate}
             </if>
         </where>
-        order by asi.id desc
     </select>
 
 </mapper>
diff --git a/src/main/resources/mapper/aftersalesservice/AfterSalesNearExpiryMapper.xml b/src/main/resources/mapper/aftersalesservice/AfterSalesNearExpiryMapper.xml
index d1cde99..e4b3c77 100644
--- a/src/main/resources/mapper/aftersalesservice/AfterSalesNearExpiryMapper.xml
+++ b/src/main/resources/mapper/aftersalesservice/AfterSalesNearExpiryMapper.xml
@@ -25,18 +25,17 @@
 
     <select id="listPage" resultType="com.ruoyi.aftersalesservice.pojo.AfterSalesNearExpiry">
         select * from after_sales_near_expiry
-        <where>
-            <if test="req.expireDate != null">
-                AND expire_date = #{req.expireDate}
-            </if>
-            <if test="req.disDate != null">
-                AND dis_date = #{req.disDate}
-            </if>
-            <if test="req.status != null">
-                AND status = #{req.status}
-            </if>
-        </where>
+        where 1 = 1
+        <if test="req.expireDate != null">
+            AND expire_date = #{req.expireDate}
+        </if>
+        <if test="req.disDate != null">
+            AND dis_date = #{req.disDate}
+        </if>
+        <if test="req.status != null">
+            AND status = #{req.status}
+        </if>
         order by create_time desc
     </select>
 
-</mapper>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/aftersalesservice/AfterSalesServiceMapper.xml b/src/main/resources/mapper/aftersalesservice/AfterSalesServiceMapper.xml
index 1d36599..2130c09 100644
--- a/src/main/resources/mapper/aftersalesservice/AfterSalesServiceMapper.xml
+++ b/src/main/resources/mapper/aftersalesservice/AfterSalesServiceMapper.xml
@@ -32,7 +32,7 @@
         <if test="req.serviceType != null">
             and service_type = #{req.serviceType}
         </if>
-        order by create_time desc
+        order by update_time desc
     </select>
     <select id="countAfterSalesService" resultType="com.ruoyi.aftersalesservice.dto.CountDto">
         select
@@ -42,4 +42,4 @@
         group by status
     </select>
 
-</mapper>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/approve/ApproveProcessMapper.xml b/src/main/resources/mapper/approve/ApproveProcessMapper.xml
index f3e628f..057cefb 100644
--- a/src/main/resources/mapper/approve/ApproveProcessMapper.xml
+++ b/src/main/resources/mapper/approve/ApproveProcessMapper.xml
@@ -29,17 +29,19 @@
         approve_user_names,approve_reason,approve_time,approve_over_time,approve_status,
         approve_delete,tenant_id,approve_type,approve_remark,start_date_time,end_date_time
     </sql>
+
     <select id="listPage" resultType="com.ruoyi.approve.vo.ApproveProcessVo">
         select * from approve_process where approve_delete = 0
         <if test="req.approveId != null and req.approveId != ''">
             and approve_id like concat('%',#{req.approveId},'%')
         </if>
-        <if test="req.approveStatus != null or req.approveStatus == 0">
+        <if test="req.approveStatus != null">
             and approve_status = #{req.approveStatus}
         </if>
         <if test="req.approveType != null ">
             and approve_type = #{req.approveType}
         </if>
-        order by id desc
+        order by approve_time desc
     </select>
+
 </mapper>
diff --git a/src/main/resources/mapper/approve/KnowledgeBaseMapper.xml b/src/main/resources/mapper/approve/KnowledgeBaseMapper.xml
index 8d41ef1..e4819c2 100644
--- a/src/main/resources/mapper/approve/KnowledgeBaseMapper.xml
+++ b/src/main/resources/mapper/approve/KnowledgeBaseMapper.xml
@@ -16,6 +16,6 @@
                 and type = #{knowledgeBase.type}
             </if>
         </where>
-        order by id desc
+
     </select>
-</mapper>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/basic/CustomerMapper.xml b/src/main/resources/mapper/basic/CustomerMapper.xml
index ffaff4e..46b7bf7 100644
--- a/src/main/resources/mapper/basic/CustomerMapper.xml
+++ b/src/main/resources/mapper/basic/CustomerMapper.xml
@@ -9,9 +9,9 @@
     <select id="listPage" resultType="com.ruoyi.basic.vo.CustomerVo">
         select
         c.*,
-        u.user_name usage_user_name,
+        u.nick_name as usage_user_name,
         (
-        select group_concat(u2.user_name separator ', ')
+        select group_concat(u2.nick_name separator ', ')
         from customer_user cu
         left join sys_user u2 on cu.user_id = u2.user_id
         where cu.customer_id = c.id
@@ -22,14 +22,7 @@
         from customer_user cu
         where cu.customer_id = c.id
         and cu.user_id != c.usage_user
-        ) as user_ids_str,
-        CASE
-            WHEN EXISTS (SELECT 1 FROM sales_ledger sl WHERE sl.customer_id = c.id)
-              OR EXISTS (SELECT 1 FROM sales_quotation sq WHERE sq.customer_id = c.id)
-              OR EXISTS (SELECT 1 FROM return_management rm WHERE rm.customer_id = c.id)
-            THEN 1
-            ELSE 0
-        END AS sales_reference_flag
+        ) as user_ids_str
         from customer c
         left join sys_user u on c.usage_user = u.user_id
         <where>
@@ -40,11 +33,11 @@
                 and customer_type = #{c.customerType}
             </if>
             <!-- 鍏捣鏌ヨ锛歵ype = 1锛堝叕娴峰鎴凤級-->
-            <if test="c.type != null and c.type == 1">
+            <!--<if test="c.type != null and c.type == 1">
                 and type = #{c.type}
-            </if>
+            </if>-->
             <!-- 绉佹捣鏌ヨ锛歵ype = 0锛堢娴峰鎴凤級鎴栬�� type = 1锛堝叕娴峰鎴凤級涓斿凡琚垎閰嶏紝骞朵笖鏄嚜宸遍鐢ㄣ�佽嚜宸卞垱寤烘垨鑰呭叡浜粰鑷繁鐨勫鎴� -->
-            <if test="c.type != null and c.type == 0">
+            <!--<if test="c.type != null and c.type == 0">
                 and (
                     (type = #{c.type} or (type = 1 and is_assigned = 1))
                     and (
@@ -57,9 +50,9 @@
                         )
                     )
                 )
-            </if>
+            </if>-->
         </where>
-        order by c.id desc
+        order by maintenance_time desc
     </select>
 
     <select id="list" resultType="com.ruoyi.basic.vo.CustomerVo">
@@ -78,14 +71,7 @@
         from customer_user cu
         where cu.customer_id = c.id
         and cu.user_id != c.usage_user
-        ) as user_ids_str,
-        CASE
-            WHEN EXISTS (SELECT 1 FROM sales_ledger sl WHERE sl.customer_id = c.id)
-              OR EXISTS (SELECT 1 FROM sales_quotation sq WHERE sq.customer_id = c.id)
-              OR EXISTS (SELECT 1 FROM return_management rm WHERE rm.customer_id = c.id)
-            THEN 1
-            ELSE 0
-        END AS sales_reference_flag
+        ) as user_ids_str
         from customer c
         left join sys_user u on c.usage_user = u.user_id
         <where>
@@ -102,11 +88,11 @@
                 and customer_type = #{c.customerType}
             </if>
             <!-- 鍏捣鏌ヨ锛歵ype = 1锛堝叕娴峰鎴凤級-->
-            <if test="c.type != null and c.type == 1">
+            <!--<if test="c.type != null and c.type == 1">
                 and type = #{c.type}
-            </if>
+            </if>-->
             <!-- 绉佹捣鏌ヨ锛歵ype = 0锛堢娴峰鎴凤級鎴栬�� type = 1锛堝叕娴峰鎴凤級涓斿凡琚垎閰嶏紝骞朵笖鏄嚜宸遍鐢ㄣ�佽嚜宸卞垱寤烘垨鑰呭叡浜粰鑷繁鐨勫鎴� -->
-            <if test="c.type != null and c.type == 0">
+            <!--<if test="c.type != null and c.type == 0">
                 and (
                     (type = #{c.type} or (type = 1 and is_assigned = 1))
                     and (
@@ -119,69 +105,67 @@
                         )
                     )
                 )
-            </if>
+            </if>-->
         </where>
-        order by c.id desc
     </select>
+
     <select id="customewTransactions" resultType="com.ruoyi.sales.vo.CustomerTransactionsVo">
         select T1.customer_id,
                c.customer_name,
-               T1.contractAmounts AS contractAmounts,
-               IFNULL(T2.receiptPaymentAmount, 0) AS receiptPaymentAmount,
-               T1.contractAmounts - IFNULL(T2.receiptPaymentAmount, 0) - IFNULL(T4.returnAmount, 0) AS receiptableAmount,
-               IFNULL(T4.returnAmount, 0) AS returnAmount
+               T1.contractAmounts
         from (select customer_id, sum(contract_amount) as contractAmounts from sales_ledger group by customer_id) T1
-        left join (select customer_id, sum(collection_amount) as receiptPaymentAmount from account_sales_collection group by customer_id) T2 on T1.customer_id = T2.customer_id
-        left join (
-            select
-                sl.customer_id,
-                sum(rm.refund_amount) as returnAmount
-            from return_management rm
-            left join shipping_info si on rm.shipping_id = si.id
-            left join sales_ledger sl on si.sales_ledger_id = sl.id
-            where rm.status=1
-            group by sl.customer_id
-        ) T4 on T4.customer_id=T1.customer_id
         left join customer c on T1.customer_id = c.id
         <where>
             <if test="customerName!=null and customerName!=''">
                 AND c.customer_name LIKE CONCAT('%', #{customerName}, '%')
             </if>
         </where>
-        order by T1.customer_id desc
     </select>
+
     <select id="customewTransactionsDetails"
             resultType="com.ruoyi.sales.vo.CustomerTransactionsDetailsVo">
         select sl.id salesLedgerId,
                sl.sales_contract_no,
                sl.execution_date,
-               sl.contract_amount AS contract_amount,
-               IFNULL(T1.receiptPaymentAmount, 0) AS receiptPaymentAmount,
-               sl.contract_amount - IFNULL(T1.receiptPaymentAmount, 0) - IFNULL(T3.returnAmount, 0) AS receiptableAmount,
-               IFNULL(T3.returnAmount, 0) AS returnAmount
+               sl.contract_amount
         from sales_ledger sl
-        left join (
-            select
-                sl.id,
-                sum(ascc.collection_amount) as receiptPaymentAmount
-            from account_sales_collection ascc
-            left join stock_out_record sor on FIND_IN_SET(sor.id, ascc.stock_out_record_ids) > 0
-            left join shipping_info s on sor.record_id = s.id
-            LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id
-            WHERE sor.record_type='13'
-              and sor.approval_status=1
-            group by  sl.id
-        )T1 on T1.id = sl.id
-        left join (
-            select sl.id,
-                   sum(rm.refund_amount) as returnAmount
-            from return_management rm
-                     left join shipping_info si on rm.shipping_id = si.id
-                     left join sales_ledger sl on si.sales_ledger_id = sl.id
-            where rm.status=1
-            group by sl.id
-        )T3 on T3.id = sl.id
         where sl.customer_id = #{customerId}
-        order by sl.id desc
+        order by sl.execution_date
+    </select>
+
+    <select id="getShippedAmountByCustomerIds" resultType="java.util.Map">
+        SELECT
+            sl.customer_id as customerId,
+            sum(sor.stock_out_num * slp.tax_inclusive_unit_price) as outboundAmount
+        FROM stock_out_record sor
+        LEFT join shipping_info s on sor.record_id = s.id
+        LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id
+        LEFT JOIN sales_ledger_product slp ON s.sales_ledger_product_id = slp.id
+        WHERE sor.record_type='13'
+            and sor.approval_status=1
+            and slp.type = 1
+            and sl.customer_id IN
+            <foreach collection="customerIds" item="customerId" open="(" separator="," close=")">
+                #{customerId}
+            </foreach>
+        group by sl.customer_id
+    </select>
+
+    <select id="getShippedAmountBySalesLedgerIds" resultType="java.util.Map">
+        SELECT
+            sl.id as salesLedgerId,
+            sum(sor.stock_out_num * slp.tax_inclusive_unit_price) as outboundAmount
+        FROM stock_out_record sor
+        LEFT join shipping_info s on sor.record_id = s.id
+        LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id
+        LEFT JOIN sales_ledger_product slp ON s.sales_ledger_product_id = slp.id
+        WHERE sor.record_type='13'
+            and sor.approval_status=1
+            and slp.type = 1
+            and sl.id IN
+            <foreach collection="salesLedgerIds" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        group by sl.id
     </select>
 </mapper>
diff --git a/src/main/resources/mapper/basic/ProductModelMapper.xml b/src/main/resources/mapper/basic/ProductModelMapper.xml
index 6270b1d..b485059 100644
--- a/src/main/resources/mapper/basic/ProductModelMapper.xml
+++ b/src/main/resources/mapper/basic/ProductModelMapper.xml
@@ -16,6 +16,7 @@
 
     <resultMap id="ProductModelVoResultMap" type="com.ruoyi.basic.vo.ProductModelVo" extends="BaseResultMap">
         <result column="create_time" property="createTime" />
+        <result column="top_product_name" property="topProductName" />
         <collection property="batchNoList"
                     ofType="java.lang.String"
                     column="{productModelId=id}"
@@ -23,9 +24,20 @@
     </resultMap>
 
     <select id="listPageProductModel" resultMap="ProductModelVoResultMap">
-        select pm.*,p.product_name
+        WITH RECURSIVE product_root AS (
+            SELECT id, parent_id, product_name
+            FROM product
+            WHERE parent_id IS NULL
+            UNION ALL
+            SELECT p.id, p.parent_id, pr.product_name
+            FROM product p
+            INNER JOIN product_root pr ON p.parent_id = pr.id
+        )
+        select pm.*, p.product_name,
+               pr.product_name as top_product_name
         from product_model pm
         left join product p on pm.product_id = p.id
+        left join product_root pr on p.id = pr.id
         <where>
             <if test="c.model != null and c.model != ''">
                 and pm.model  like  concat('%',#{c.model},'%')
diff --git a/src/main/resources/mapper/basic/SupplierManageMapper.xml b/src/main/resources/mapper/basic/SupplierManageMapper.xml
index 63bdf7e..93bd608 100644
--- a/src/main/resources/mapper/basic/SupplierManageMapper.xml
+++ b/src/main/resources/mapper/basic/SupplierManageMapper.xml
@@ -35,7 +35,7 @@
                 AND T1.is_white = #{supplierManageDto.isWhite}
             </if>
         </where>
-        order by T1.id desc
+        order by T1.maintain_time desc
     </select>
 
     <select id="supplierExportList" resultType="com.ruoyi.basic.excel.SupplierManageExcelDto">
@@ -69,65 +69,29 @@
             </if>
         </where>
     </select>
+
     <select id="supplierTransactions" resultType="com.ruoyi.purchase.vo.SupplierTransactionsVo">
-        select T1.supplier_id,
+        SELECT T1.supplier_id,
                sm.supplier_name,
-               T1.contractAmounts,
-               IFNULL(T2.paymentAmount, 0) AS paymentAmount,
-               T1.contractAmounts - IFNULL(T2.paymentAmount, 0) - IFNULL(T4.returnAmount, 0) AS payableAmount,
-               IFNULL(T4.returnAmount, 0) AS returnAmount
-        from (select supplier_id, sum(contract_amount) as contractAmounts from purchase_ledger group by supplier_id) T1
-        left join (select supplier_id, sum(payment_amount) as paymentAmount from account_purchase_payment group by supplier_id) T2 on T1.supplier_id = T2.supplier_id
-        left join (
-            select
-                supplier_id,
-                sum(total_amount) as returnAmount
-            from purchase_return_orders pro
-            group by supplier_id
-        ) T4 on T4.supplier_id=T1.supplier_id
-        left join supplier_manage sm on T1.supplier_id = sm.id
+               T1.contractAmounts
+        FROM (SELECT supplier_id, SUM(contract_amount) AS contractAmounts FROM purchase_ledger GROUP BY supplier_id) T1
+        LEFT JOIN supplier_manage sm ON T1.supplier_id = sm.id
         <where>
             <if test="supplierName!=null and supplierName!=''">
                 AND sm.supplier_name LIKE CONCAT('%',#{supplierName},'%')
             </if>
         </where>
-        order by T1.supplier_id desc
     </select>
+
     <select id="supplierTransactionsDetails"
             resultType="com.ruoyi.purchase.vo.SupplierTransactionsDetailsVo">
-       select pl.id  purchaseLedgerId,
+       SELECT pl.id purchaseLedgerId,
               pl.purchase_contract_number,
               pl.execution_date,
-              pl.contract_amount AS contract_amount,
-              IFNULL(T1.paymentAmount, 0) AS paymentAmount,
-              pl.contract_amount - IFNULL(T1.paymentAmount, 0) - IFNULL(T3.returnAmount, 0) AS payableAmount,
-              IFNULL(T3.returnAmount, 0) AS returnAmount
-       from purchase_ledger pl
-       left join (
-           select
-               pl.id,
-               sum(app.payment_amount) as paymentAmount
-           from account_purchase_payment app
-           left join account_payment_application apa on app.account_payment_application_id = apa.id
-           left join stock_in_record sir on FIND_IN_SET(sir.id, apa.stock_in_record_ids) > 0
-               -- 10 绫诲瀷鎵嶅叧鑱旇川妫�琛�
-           LEFT JOIN quality_inspect qi ON sir.record_type = 10 AND sir.record_id = qi.id
-               -- 鍔ㄦ�佸叧鑱旈噰璐紙鑷姩閫傞厤 7 鍜� 10锛�
-           LEFT JOIN purchase_ledger pl
-                     ON pl.id = IF(sir.record_type = 7, sir.record_id, qi.purchase_ledger_id)
-           WHERE sir.approval_status = 1
-             AND sir.record_type IN ('7','10')
-           group by pl.id
-       )T1 on T1.id = pl.id
-       left join (
-           select pl.id,
-                  sum(pro.total_amount) as returnAmount
-           from purchase_return_orders pro
-                    left join purchase_ledger pl on pro.purchase_ledger_id = pl.id
-           group by pl.id
-       )T3 on T3.id = pl.id
-       where pl.supplier_id = #{supplierId}
-       order by pl.id desc
+              pl.contract_amount
+       FROM purchase_ledger pl
+       WHERE pl.supplier_id = #{supplierId}
     </select>
 
+
 </mapper>
diff --git a/src/main/resources/mapper/collaborativeApproval/NoticeMapper.xml b/src/main/resources/mapper/collaborativeApproval/NoticeMapper.xml
index 06acc33..dcb620a 100644
--- a/src/main/resources/mapper/collaborativeApproval/NoticeMapper.xml
+++ b/src/main/resources/mapper/collaborativeApproval/NoticeMapper.xml
@@ -3,7 +3,7 @@
 <mapper namespace="com.ruoyi.collaborativeApproval.mapper.NoticeMapper">
 
     <select id="listPage" resultType="com.ruoyi.collaborativeApproval.dto.NoticeDTO">
-        select n.*, su.user_name as create_user_name
+        select n.*, su.nick_name as create_user_name
         from notice n
         left join sys_user su on n.create_user = su.user_id
         <where>
@@ -17,6 +17,5 @@
                 and n.status = #{ew.status}
             </if>
         </where>
-        order by n.create_time desc
     </select>
 </mapper>
diff --git a/src/main/resources/mapper/collaborativeApproval/RulesRegulationsManagementMapper.xml b/src/main/resources/mapper/collaborativeApproval/RulesRegulationsManagementMapper.xml
index 9ae4b8d..89d0869 100644
--- a/src/main/resources/mapper/collaborativeApproval/RulesRegulationsManagementMapper.xml
+++ b/src/main/resources/mapper/collaborativeApproval/RulesRegulationsManagementMapper.xml
@@ -13,7 +13,7 @@
     </resultMap>
 
     <select id="listPage" resultMap="RulesRegulationsManagementDTOMap">
-        select rrm.*, su.user_name as create_user_name
+        select rrm.*, su.nick_name as create_user_name
         from rules_regulations_management rrm
         left join sys_user su on rrm.create_user = su.user_id
         <where>
@@ -27,6 +27,5 @@
                 and rrm.category = #{ew.category}
             </if>
         </where>
-        order by rrm.id desc
     </select>
 </mapper>
diff --git a/src/main/resources/mapper/collaborativeApproval/SealApplicationManagementMapper.xml b/src/main/resources/mapper/collaborativeApproval/SealApplicationManagementMapper.xml
index 53b2f3c..d8a5956 100644
--- a/src/main/resources/mapper/collaborativeApproval/SealApplicationManagementMapper.xml
+++ b/src/main/resources/mapper/collaborativeApproval/SealApplicationManagementMapper.xml
@@ -37,6 +37,5 @@
             </if>
         </where>
         GROUP BY sam.id
-        order by sam.id desc
     </select>
 </mapper>
diff --git a/src/main/resources/mapper/device/DeviceMaintenanceMapper.xml b/src/main/resources/mapper/device/DeviceMaintenanceMapper.xml
index cb05e72..99b9bbc 100644
--- a/src/main/resources/mapper/device/DeviceMaintenanceMapper.xml
+++ b/src/main/resources/mapper/device/DeviceMaintenanceMapper.xml
@@ -26,31 +26,41 @@
         left join device_ledger dl on dm.device_ledger_id = dl.id
         left join sys_user su on dm.create_user = su.user_id
         <where>
-            <if test="deviceMaintenanceDto.deviceName != null">
-                and dl.device_name like concat('%',#{deviceMaintenanceDto.deviceName},'%')
+            <if test="deviceMaintenanceDto.deviceName != null and deviceMaintenanceDto.deviceName != ''">
+                and dl.device_name like concat('%', #{deviceMaintenanceDto.deviceName}, '%')
             </if>
-            <if test="deviceMaintenanceDto.deviceModel != null">
-                and dl.device_model like concat('%',#{deviceMaintenanceDto.deviceModel},'%')
+            <if test="deviceMaintenanceDto.deviceModel != null and deviceMaintenanceDto.deviceModel != ''">
+                and dl.device_model like concat('%', #{deviceMaintenanceDto.deviceModel}, '%')
             </if>
             <if test="deviceMaintenanceDto.status != null">
                 and dm.status = #{deviceMaintenanceDto.status}
             </if>
-            <if test="deviceMaintenanceDto.maintenanceActuallyName != null">
-                and dm.maintenance_actually_name like concat('%',#{deviceMaintenanceDto.maintenanceActuallyName},'%')
+            <if test="deviceMaintenanceDto.maintenanceActuallyName != null and deviceMaintenanceDto.maintenanceActuallyName != ''">
+                and dm.maintenance_actually_name like concat('%', #{deviceMaintenanceDto.maintenanceActuallyName}, '%')
             </if>
             <if test="deviceMaintenanceDto.maintenancePlanTime != null">
-                and dm.maintenance_plan_time like concat('%',#{deviceMaintenanceDto.maintenancePlanTime},'%')
+                and dm.maintenance_plan_time = #{deviceMaintenanceDto.maintenancePlanTime}
             </if>
             <if test="deviceMaintenanceDto.maintenanceActuallyTime != null">
-                and dm.maintenance_actually_time like concat('%',#{deviceMaintenanceDto.maintenanceActuallyTime},'%')
-            </if>
-            <if test="deviceMaintenanceDto.maintenanceActuallyTime != null">
-                and dm.maintenance_actually_time >= str_to_date(#{deviceMaintenanceDto.maintenanceActuallyTime}, '%Y-%m-%d')
-                and dm.maintenance_actually_time &lt; date_add(str_to_date(#{deviceMaintenanceDto.maintenanceActuallyTime}, '%Y-%m-%d'), interval 1 day)
+                and dm.maintenance_actually_time &gt;= str_to_date(#{deviceMaintenanceDto.maintenanceActuallyTime},
+                '%Y-%m-%d')
+                and dm.maintenance_actually_time &lt;
+                date_add(str_to_date(#{deviceMaintenanceDto.maintenanceActuallyTime}, '%Y-%m-%d'), interval 1 day)
             </if>
         </where>
-        order by dm.create_time desc
+        order by
+        <!--    寰呬繚鍏�(0)浼樺厛鎺掑湪涓婇潰锛屽凡瀹岀粨(1)鍦ㄤ笅闈� -->
+        dm.status asc,
+        case
+        <!-- 褰撶姸鎬佹槸 0锛堝緟淇濆吇锛夋椂锛屾寜璁″垝鏃堕棿鍗囧簭锛屽嵆鏃堕棿鏈�杩滅殑鍗曞瓙鍦ㄦ渶涓婇潰 -->
+        when dm.status = 0 then dm.maintenance_plan_time
+        end asc,
+        case
+        <!-- 褰撶姸鎬佹槸 1锛堝凡瀹岀粨锛夋椂锛屾寜瀹為檯淇濆吇鏃堕棿闄嶅簭锛屾渶杩戝垰淇濆吇瀹岀殑鍗曞瓙鍦ㄥ凡瀹岀粨閲屾帓鏈�鍓� -->
+        when dm.status = 1 then dm.maintenance_actually_time
+        end desc
     </select>
+
     <select id="detailById" resultType="com.ruoyi.device.vo.DeviceMaintenanceVo">
         select dm.id,
                dm.device_ledger_id,
diff --git a/src/main/resources/mapper/device/DeviceRepairMapper.xml b/src/main/resources/mapper/device/DeviceRepairMapper.xml
index 10a0abf..955e129 100644
--- a/src/main/resources/mapper/device/DeviceRepairMapper.xml
+++ b/src/main/resources/mapper/device/DeviceRepairMapper.xml
@@ -7,28 +7,29 @@
 
     <select id="queryPage" resultType="com.ruoyi.device.vo.DeviceRepairVo">
         select dr.id,
-               dr.device_ledger_id,
-                dr.repair_time,
-                dr.repair_name,
-                dr.remark,
-                 dr.maintenance_name,
-                 dr.maintenance_time,
-                 dr.maintenance_result,
-                 dr.acceptance_name,
-                 dr.acceptance_time,
-                 dr.acceptance_remark,
-                 dr.status,
-                dr.create_time,
-                dr.update_time,
-                dr.create_user,
-                dr.update_user,
-               dr.tenant_id,
-               dl.device_name,
-               dl.device_model,
-               dr.machinery_category
+        dr.device_ledger_id,
+        dr.repair_time,
+        dr.repair_name,
+        dr.remark,
+        dr.maintenance_name,
+        dr.maintenance_time,
+        dr.maintenance_result,
+        dr.acceptance_name,
+        dr.acceptance_time,
+        dr.acceptance_remark,
+        dr.status,
+        dr.create_time,
+        dr.update_time,
+        dr.create_user,
+        dr.update_user,
+        dr.tenant_id,
+        dl.device_name,
+        dl.device_model,
+        dr.machinery_category
         from device_repair dr
         left join device_ledger dl on dr.device_ledger_id = dl.id
         <where>
+            1 = 1
             <if test="deviceRepairDto.deviceName != null">
                 and dl.device_name like concat('%',#{deviceRepairDto.deviceName},'%')
             </if>
@@ -52,8 +53,9 @@
                 and dr.maintenance_time like concat('%',#{deviceRepairDto.maintenanceTimeStr},'%')
             </if>
         </where>
-        order by dr.create_time desc
+        order by dr.id desc
     </select>
+
     <select id="detailById" resultType="com.ruoyi.device.vo.DeviceRepairVo">
         select dr.id,
                dr.device_ledger_id,
diff --git a/src/main/resources/mapper/measuringinstrumentledger/MeasuringInstrumentLedgerMapper.xml b/src/main/resources/mapper/measuringinstrumentledger/MeasuringInstrumentLedgerMapper.xml
index 7de15bd..65741f5 100644
--- a/src/main/resources/mapper/measuringinstrumentledger/MeasuringInstrumentLedgerMapper.xml
+++ b/src/main/resources/mapper/measuringinstrumentledger/MeasuringInstrumentLedgerMapper.xml
@@ -62,6 +62,6 @@
                 AND record_date = DATE_FORMAT(#{req.recordDate},'%Y-%m-%d')
             </if>
         </where>
-        ORDER BY create_time DESC
+        ORDER BY update_time DESC
     </select>
 </mapper>
diff --git a/src/main/resources/mapper/measuringinstrumentledger/MeasuringInstrumentLedgerRecordMapper.xml b/src/main/resources/mapper/measuringinstrumentledger/MeasuringInstrumentLedgerRecordMapper.xml
index e01ef1e..69446e0 100644
--- a/src/main/resources/mapper/measuringinstrumentledger/MeasuringInstrumentLedgerRecordMapper.xml
+++ b/src/main/resources/mapper/measuringinstrumentledger/MeasuringInstrumentLedgerRecordMapper.xml
@@ -32,7 +32,7 @@
                 AND t1.record_date = DATE_FORMAT(#{req.recordDate},'%Y-%m-%d')
             </if>
         </where>
-        ORDER BY t1.create_time DESC
+        ORDER BY t1.update_time DESC
     </select>
     <select id="list" resultType="com.ruoyi.measuringinstrumentledger.pojo.MeasuringInstrumentLedgerRecord">
         SELECT
@@ -65,4 +65,4 @@
         </where>
         ORDER BY t1.update_time DESC
     </select>
-</mapper>
+</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
index 301ff6f..611d51e 100644
--- a/src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml
+++ b/src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml
@@ -10,6 +10,5 @@
                 and sp.name like concat('%',#{spareParts.name},'%')
             </if>
         </where>
-        order by sp.create_time desc
     </select>
-</mapper>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml b/src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml
index 6231005..e069196 100644
--- a/src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml
+++ b/src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml
@@ -6,30 +6,13 @@
         select rm.*,
                c.customer_name,
                si.shipping_no,
-               rm.shipping_type,
-               rm.truck_plate_no,
-               rm.express_company,
-               rm.express_no,
                sl.project_name,
                sl.sales_contract_no,
-               sl.salesman,
-                CASE
-                    WHEN tempA.total_approval = 0 OR tempA.total_approval IS NULL THEN 0
-                    WHEN tempA.approval_sum = tempA.total_approval THEN 1
-                    ELSE 2
-                END AS stock_in_approval_status
+               sl.salesman
         from return_management rm
                  left join shipping_info si on rm.shipping_id = si.id
                  left join customer c on rm.customer_id = c.id
                  left join sales_ledger sl on si.sales_ledger_id = sl.id
-                LEFT JOIN (
-                SELECT
-                rsp.return_management_id,
-                COUNT(sir.id) AS total_approval,
-                SUM(CASE WHEN sir.approval_status = 1 THEN 1 ELSE 0 END) AS approval_sum
-                FROM return_sale_product rsp LEFT JOIN stock_in_record sir ON rsp.id = sir.record_id
-                GROUP BY rsp.return_management_id
-                ) tempA ON tempA.return_management_id = rm.id
         <where>
             <if test="req.returnNo != null and req.returnNo != ''">
                 and rm.return_no like concat('%',#{req.returnNo},'%')
@@ -56,16 +39,11 @@
                 and sl.sales_contract_no like concat('%',#{req.salesContractNo},'%')
             </if>
         </where>
-        order by rm.id desc
     </select>
     <select id="getReturnManagementDtoById" resultType="com.ruoyi.procurementrecord.bean.dto.ReturnManagementDto">
      select rm.*,
                c.customer_name,
                si.shipping_no,
-               rm.shipping_type,
-               rm.truck_plate_no,
-               rm.express_company,
-               rm.express_no,
                sl.project_name,
                sl.sales_contract_no,
                sl.salesman
@@ -80,10 +58,6 @@
                 rm.return_no,
                 c.customer_name,
                 si.shipping_no,
-                rm.shipping_type,
-                rm.truck_plate_no,
-                rm.express_company,
-                rm.express_no,
                 rm.make_time,
                 rm.refund_amount,
                 rm.return_reason,
diff --git a/src/main/resources/mapper/procurementrecord/ReturnSaleProductMapper.xml b/src/main/resources/mapper/procurementrecord/ReturnSaleProductMapper.xml
index d104b21..6b15d56 100644
--- a/src/main/resources/mapper/procurementrecord/ReturnSaleProductMapper.xml
+++ b/src/main/resources/mapper/procurementrecord/ReturnSaleProductMapper.xml
@@ -19,9 +19,8 @@
             sor.outbound_batches,
             sor.stock_out_num,
             sor.batch_no,
-            GREATEST( sor.stock_out_num - COALESCE ( rs.total_return_num, 0 ), 0 ) AS un_quantity,
-            COALESCE ( rs.pending_return_num, 0 ) AS pending_return_num ,
-            COALESCE ( rs.return_num, 0 ) AS total_return_num
+               GREATEST(sor.stock_out_num - COALESCE(rs1.total_return_num1, 0), 0) AS un_quantity,
+               COALESCE(rs.total_return_num, 0)                             AS total_return_num
         FROM return_sale_product rsp
                  LEFT JOIN return_management rm ON rm.id = rsp.return_management_id
                  LEFT JOIN shipping_info si ON si.id = rm.shipping_id
@@ -31,11 +30,15 @@
                 left join product_model pm on slp.product_model_id = pm.id
                   LEFT JOIN product p on pm.product_id = p.id
                  LEFT JOIN (SELECT stock_out_record_id,
-                                   SUM(num) AS total_return_num,
-                                   SUM( CASE WHEN return_management_id =#{returnManagementId} AND STATUS = 0 THEN num ELSE 0 END ) AS pending_return_num ,
-                                   SUM( CASE WHEN STATUS = 1 THEN num ELSE 0 END ) AS return_num
+                                   SUM(num) AS total_return_num
                             FROM return_sale_product
+                            WHERE 1 = 1 and return_management_id = #{returnManagementId}
                             GROUP BY stock_out_record_id) rs ON rs.stock_out_record_id = sor.id
+                 LEFT JOIN (SELECT stock_out_record_id,
+                                   SUM(num) AS total_return_num1
+                            FROM return_sale_product
+                            WHERE 1 = 1
+                            GROUP BY stock_out_record_id) rs1 ON rs1.stock_out_record_id = sor.id
         where rm.id =#{returnManagementId}
     </select>
     <select id="listReturnSaleProduct" resultType="com.ruoyi.procurementrecord.bean.dto.ReturnSaleProductDto">
diff --git a/src/main/resources/mapper/production/ProductionAccountMapper.xml b/src/main/resources/mapper/production/ProductionAccountMapper.xml
index 4be1c23..d66347f 100644
--- a/src/main/resources/mapper/production/ProductionAccountMapper.xml
+++ b/src/main/resources/mapper/production/ProductionAccountMapper.xml
@@ -124,8 +124,10 @@
         select date_format(scheduling_date, '%m-%d') as dateStr,
                cast(ifnull(sum(finished_num), 0) as decimal(18,2)) as numberOfCompleted,
                cast(ifnull(sum(work_hours), 0) as decimal(18,2)) as amount,
-               cast(0 as decimal(18,2)) as passRate
+               cast(sum(ppo.quantity) / sum(ppo.quantity + ppo.scrap_qty) * 100.00 as decimal(18,2)) as passRate
         from production_account
+        left join production_product_main ppm on ppm.id = production_account.production_product_main_id
+        left join production_product_output ppo on ppo.production_product_main_id = ppm.id
         where scheduling_date &gt;= #{startDate}
           and scheduling_date &lt;= #{endDate}
         group by date_format(scheduling_date, '%m-%d')
diff --git a/src/main/resources/mapper/production/ProductionOperationTaskMapper.xml b/src/main/resources/mapper/production/ProductionOperationTaskMapper.xml
index 5847f5f..bdcfa4b 100644
--- a/src/main/resources/mapper/production/ProductionOperationTaskMapper.xml
+++ b/src/main/resources/mapper/production/ProductionOperationTaskMapper.xml
@@ -71,7 +71,7 @@
                 and pot.work_order_no like concat('%', #{c.workOrderNo}, '%')
             </if>
         </where>
-        order by pot.production_order_id desc, poro.drag_sort
+        order by pot.work_order_no desc
     </select>
 
     <select id="selectTaskStatisticsByDate" resultType="com.ruoyi.home.dto.ProductionTaskStatisticsDto">
@@ -123,9 +123,9 @@
             <if test="endDateTime != null">
                 and ppo.create_time &lt;= #{endDateTime}
             </if>
-            <if test="userId != null">
-                and ppm.create_user = #{userId}
-            </if>
+<!--            <if test="userId != null">-->
+<!--                and ppm.create_user = #{userId}-->
+<!--            </if>-->
             <if test="processIds != null and processIds.size() > 0">
                 and poro.technology_operation_id in
                 <foreach collection="processIds" item="id" open="(" separator="," close=")">
@@ -215,4 +215,18 @@
         order by min(poro.drag_sort), poro.operation_name
     </select>
 
+    <select id="listProcessStatusByOrderIds" resultType="com.ruoyi.production.bean.vo.ProductionOrderProcessTaskVo">
+        select pot.production_order_id as productionOrderId,
+               poro.operation_name as operationName,
+               ROUND(IFNULL(pot.complete_quantity, 0) / NULLIF(pot.plan_quantity, 0) * 100, 2) AS completionStatus
+        from production_operation_task pot
+                 left join production_order_routing_operation poro
+                           on pot.production_order_routing_operation_id = poro.id
+        where pot.production_order_id in
+        <foreach collection="orderIds" item="orderId" open="(" separator="," close=")">
+            #{orderId}
+        </foreach>
+        order by pot.production_order_id, poro.drag_sort asc, pot.id asc
+    </select>
+
 </mapper>
diff --git a/src/main/resources/mapper/production/ProductionOrderMapper.xml b/src/main/resources/mapper/production/ProductionOrderMapper.xml
index 67cc55b..c5c9e3a 100644
--- a/src/main/resources/mapper/production/ProductionOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductionOrderMapper.xml
@@ -134,7 +134,7 @@
         <include refid="ProductionOrderVoColumns" />
         <include refid="ProductionOrderVoFrom" />
         <include refid="ProductionOrderWhere" />
-        order by po.id desc
+        order by po.nps_no desc
     </select>
 
     <select id="listProductionOrder" resultMap="ProductionOrderVoResultMap">
@@ -232,10 +232,8 @@
                 and po.create_time &lt; #{endTime}
             </if>
         </where>
-        order by po.id desc
-        <if test="size != null and size &gt;= 0">
-            limit #{offset}, #{size}
-        </if>
+        order by po.nps_no desc
+        limit #{offset}, #{size}
     </select>
 
     <select id="countHomeOrderProgress" resultType="java.lang.Long">
diff --git a/src/main/resources/mapper/production/ProductionPlanMapper.xml b/src/main/resources/mapper/production/ProductionPlanMapper.xml
index 69ccd36..724eb83 100644
--- a/src/main/resources/mapper/production/ProductionPlanMapper.xml
+++ b/src/main/resources/mapper/production/ProductionPlanMapper.xml
@@ -58,7 +58,7 @@
                 </if>
             </if>
         </where>
-        ORDER BY COALESCE(pp.id) DESC
+        ORDER BY pp.required_date DESC
     </select>
 
     <select id="selectWithMaterialByIds" resultType="com.ruoyi.production.bean.dto.ProductionPlanDto">
diff --git a/src/main/resources/mapper/production/ProductionProductInputMapper.xml b/src/main/resources/mapper/production/ProductionProductInputMapper.xml
index fe88ae3..f04a824 100644
--- a/src/main/resources/mapper/production/ProductionProductInputMapper.xml
+++ b/src/main/resources/mapper/production/ProductionProductInputMapper.xml
@@ -42,5 +42,15 @@
         </where>
         order by ppi.create_time desc
     </select>
+    <select id="selectInputStats" resultType="java.util.Map">
+        select DATE_FORMAT(create_time, '%Y-%m-%d') as statDate,
+               sum(ifnull(quantity, 0)) as quantity
+#                sum(ifnull(scrap_qty, 0)) as scrapQty
+        from production_product_input
+        where create_time &gt;= #{startDate}
+          and create_time &lt;= #{endDate}
+        group by DATE_FORMAT(create_time, '%Y-%m-%d')
+        order by statDate asc
+    </select>
 
 </mapper>
diff --git a/src/main/resources/mapper/production/ProductionProductOutputMapper.xml b/src/main/resources/mapper/production/ProductionProductOutputMapper.xml
index f31ca01..04bd6a9 100644
--- a/src/main/resources/mapper/production/ProductionProductOutputMapper.xml
+++ b/src/main/resources/mapper/production/ProductionProductOutputMapper.xml
@@ -48,13 +48,13 @@
     </select>
 
     <select id="selectDailyOutputStats" resultType="java.util.Map">
-        select date(create_time) as statDate,
+        select DATE_FORMAT(create_time, '%Y-%m-%d') as statDate,
                sum(ifnull(quantity, 0)) as quantity,
                sum(ifnull(scrap_qty, 0)) as scrapQty
         from production_product_output
         where create_time &gt;= #{startDate}
           and create_time &lt;= #{endDate}
-        group by date(create_time)
+        group by DATE_FORMAT(create_time, '%Y-%m-%d')
         order by statDate asc
     </select>
 
diff --git a/src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml b/src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
index 8b94eb7..ea98e2b 100644
--- a/src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
+++ b/src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
@@ -6,8 +6,7 @@
 
     <update id="updateContractAmountById">
         UPDATE purchase_ledger
-        SET contract_amount = #{totalTaxInclusiveAmount},
-            net_contract_amount = #{totalTaxInclusiveAmount}
+        SET contract_amount = #{totalTaxInclusiveAmount}
         WHERE id = #{id}
     </update>
     <select id="selectPurchaseStats" resultType="com.ruoyi.home.dto.IncomeExpenseAnalysisDto">
@@ -28,7 +27,6 @@
                 pl.supplier_name,
                 pl.project_name,
                 pl.contract_amount,
-                pl.net_contract_amount,
                 pl.entry_date,
                 pl.execution_date,
                 pl.recorder_id,
@@ -90,6 +88,23 @@
                                 AND slp.sales_ledger_id = qi.purchase_ledger_id
                                 AND slp.product_model_id = qi.product_model_id
                             WHERE sir.approval_status = 1
+
+                            UNION ALL
+
+        SELECT slp.id AS sales_ledger_product_id,
+        sir.stock_in_num
+        FROM stock_in_record sir
+        INNER JOIN quality_unqualified qu
+        ON TRIM(sir.record_type) = '11'
+        AND sir.record_id = qu.id
+        INNER JOIN quality_inspect qi
+        ON qi.id = qu.inspect_id
+        INNER JOIN sales_ledger_product slp
+        ON slp.type = 2
+        AND slp.sales_ledger_id = qi.purchase_ledger_id
+        AND slp.product_model_id = qi.product_model_id
+        WHERE sir.approval_status = 1
+
                         ) rel
                         GROUP BY rel.sales_ledger_product_id
                     ) approved_qty ON approved_qty.sales_ledger_product_id = slp.id
@@ -122,12 +137,6 @@
                 <if test="c.supplierId != null">
                     AND pl.supplier_id = #{c.supplierId}
                 </if>
-                <if test="c.ids != null and c.ids.size() > 0">
-                    AND pl.id IN
-                    <foreach collection="c.ids" item="id" open="(" separator="," close=")">
-                        #{id}
-                    </foreach>
-                </if>
                 <if test="c.approvalStatus != null">
                     AND pl.approval_status = #{c.approvalStatus}
                 </if>
@@ -136,47 +145,7 @@
         <if test="c.stockInStatus != null and c.stockInStatus != ''">
             WHERE result.stock_in_status = #{c.stockInStatus}
         </if>
-        ORDER BY result.entry_date DESC
-    </select>
-
-    <select id="selectReturnablePurchaseLedgerList" resultType="com.ruoyi.purchase.pojo.PurchaseLedger">
-        SELECT DISTINCT pl.*
-        FROM purchase_ledger pl
-        WHERE 1 = 1
-        <if test="c.purchaseContractNumber != null and c.purchaseContractNumber != ''">
-            AND pl.purchase_contract_number LIKE CONCAT('%', #{c.purchaseContractNumber}, '%')
-        </if>
-        <if test="c.supplierId != null">
-            AND pl.supplier_id = #{c.supplierId}
-        </if>
-        <if test="c.approvalStatus != null">
-            AND pl.approval_status = #{c.approvalStatus}
-        </if>
-        AND EXISTS (
-            SELECT 1
-            FROM stock_in_record sir
-            LEFT JOIN quality_inspect qi
-                ON sir.record_type = '10'
-               AND sir.record_id = qi.id
-            LEFT JOIN sales_ledger_product slp
-                ON slp.sales_ledger_id = pl.id
-               AND slp.product_model_id = sir.product_model_id
-               AND slp.type = 2
-            LEFT JOIN (
-                SELECT stock_in_record_id, SUM(return_quantity) AS total_return_num
-                FROM purchase_return_order_products
-                GROUP BY stock_in_record_id
-            ) rs ON rs.stock_in_record_id = sir.id
-            WHERE sir.approval_status = 1
-              AND sir.record_type IN ('7','10')
-              AND (
-                  (sir.record_type = '7' AND sir.record_id = pl.id)
-                  OR (sir.record_type = '10' AND qi.purchase_ledger_id = pl.id)
-              )
-              AND slp.id IS NOT NULL
-              AND GREATEST(sir.stock_in_num - COALESCE(rs.total_return_num, 0), 0) > 0
-        )
-        ORDER BY pl.entry_date DESC
+        ORDER BY result.entry_date DESC, result.purchase_contract_number DESC
     </select>
 
     <select id="selectTotalPurchaseAmount" resultType="java.math.BigDecimal">
diff --git a/src/main/resources/mapper/purchase/PurchaseReturnOrdersMapper.xml b/src/main/resources/mapper/purchase/PurchaseReturnOrdersMapper.xml
index 8ca4903..2f782ff 100644
--- a/src/main/resources/mapper/purchase/PurchaseReturnOrdersMapper.xml
+++ b/src/main/resources/mapper/purchase/PurchaseReturnOrdersMapper.xml
@@ -8,10 +8,6 @@
         <result column="no" property="no" />
         <result column="return_type" property="returnType" />
         <result column="supplier_id" property="supplierId" />
-        <result column="shipping_type" property="shippingType" />
-        <result column="truck_plate_no" property="truckPlateNo" />
-        <result column="express_company" property="expressCompany" />
-        <result column="express_no" property="expressNo" />
         <result column="project_id" property="projectId" />
         <result column="project_phase" property="projectPhase" />
         <result column="prepared_at" property="preparedAt" />
@@ -26,18 +22,7 @@
         SELECT
             pro.*,
             sm.supplier_name as supplier_name,
-            pl.purchase_contract_number as purchase_contract_number,
-            CASE
-                WHEN EXISTS (
-                    SELECT 1
-                    FROM purchase_return_order_products prop
-                    INNER JOIN stock_out_record sor ON sor.record_id = prop.id
-                        AND sor.record_type = '9'
-                        AND sor.approval_status = 1
-                    WHERE prop.purchase_return_order_id = pro.id
-                ) THEN 1
-                ELSE 0
-            END AS stock_out_approved
+            pl.purchase_contract_number as purchase_contract_number
         FROM purchase_return_orders pro
                  LEFT JOIN supplier_manage sm ON pro.supplier_id = sm.id
                  LEFT JOIN purchase_ledger pl ON pl.id = pro.purchase_ledger_id
@@ -74,10 +59,6 @@
                 pro.no returnNo,
                 t.inboundBatches,
                 sm.supplier_name,
-                pro.shipping_type,
-                pro.truck_plate_no,
-                pro.express_company,
-                pro.express_no,
                 pro.prepared_at,
                 pro.total_amount,
                 CASE pro.return_type WHEN 0 THEN '閫�璐ч��娆�' WHEN 1 THEN '鎷掓敹' END AS returnType,
@@ -119,22 +100,13 @@
             sir.stock_in_num,
             sir.batch_no,
             slp.tax_inclusive_unit_price,
-            GREATEST(
-                sir.stock_in_num
-                - COALESCE(rs.total_return_num, 0)
-                - COALESCE(so.total_sale_out_num, 0),
-                0
-            ) AS un_quantity,
-            COALESCE(rs.total_return_num, 0) AS total_return_num,
-            COALESCE(so.total_sale_out_num, 0) AS saleOutQuantity
+            GREATEST(sir.stock_in_num - COALESCE(rs.total_return_num, 0), 0) AS un_quantity,
+            COALESCE(rs.total_return_num, 0) AS total_return_num
             FROM stock_in_record sir
             LEFT JOIN quality_inspect qi ON sir.record_type = 10 AND sir.record_id = qi.id
             LEFT JOIN purchase_ledger pl
             ON pl.id = IF(sir.record_type = 7, sir.record_id, qi.purchase_ledger_id)
-            LEFT JOIN sales_ledger_product slp
-                ON pl.id = slp.sales_ledger_id
-               AND slp.product_model_id = sir.product_model_id
-               AND slp.type = 2
+            LEFT JOIN sales_ledger_product slp ON pl.id = slp.sales_ledger_id
             LEFT JOIN (
                 SELECT
                     stock_in_record_id,
@@ -144,24 +116,7 @@
                 WHERE 1=1
                 GROUP BY stock_in_record_id
             ) rs ON rs.stock_in_record_id = sir.id
-            LEFT JOIN (
-                SELECT
-                    inv.batch_no,
-                    inv.product_model_id,
-                    SUM(spd.quantity) AS total_sale_out_num
-                FROM shipping_product_detail spd
-                INNER JOIN shipping_info si
-                    ON si.id = spd.shipping_info_id
-                INNER JOIN stock_out_record sor
-                    ON sor.record_id = si.id
-                   AND sor.record_type = '13'
-                   AND sor.approval_status IN (0, 1, 3)
-                INNER JOIN stock_inventory inv
-                    ON inv.id = spd.stock_inventory_id
-                GROUP BY inv.batch_no, inv.product_model_id
-            ) so ON so.product_model_id = sir.product_model_id
-               AND (so.batch_no = sir.batch_no OR (so.batch_no IS NULL AND sir.batch_no IS NULL))
-        WHERE sir.approval_status = 1
+        WHERE sir.approval_status = 1 AND slp.type = 2
         AND sir.record_type IN ('7','10')
          and pl.id = #{purchaseLedgerId}
     </select>
@@ -180,14 +135,8 @@
            slp.tax_inclusive_unit_price,
            prop.return_quantity,
            prop.purchase_return_order_id,
-           GREATEST(
-               sir.stock_in_num
-               - COALESCE(rs.total_return_num, 0)
-               - COALESCE(so.total_sale_out_num, 0),
-               0
-           ) AS un_quantity,
-           COALESCE(rs.total_return_num, 0)                             AS total_return_num,
-           COALESCE(so.total_sale_out_num, 0)                           AS saleOutQuantity
+           GREATEST(sir.stock_in_num - COALESCE(rs1.total_return_num1, 0), 0) AS un_quantity,
+           COALESCE(rs.total_return_num, 0)                             AS total_return_num
     from purchase_return_order_products prop
     left join purchase_return_orders pro on prop.purchase_return_order_id = pro.id
     LEFT JOIN stock_in_record sir ON prop.stock_in_record_id = sir.id and sir.record_type in ('7','10')
@@ -195,25 +144,13 @@
     LEFT JOIN (SELECT stock_in_record_id,
                       SUM(return_quantity) AS total_return_num
                FROM purchase_return_order_products
-               WHERE 1 = 1
+               WHERE 1 = 1 and purchase_return_order_id = #{id}
                GROUP BY stock_in_record_id) rs ON rs.stock_in_record_id = sir.id
-    LEFT JOIN (
-        SELECT
-            inv.batch_no,
-            inv.product_model_id,
-            SUM(spd.quantity) AS total_sale_out_num
-        FROM shipping_product_detail spd
-        INNER JOIN shipping_info si
-            ON si.id = spd.shipping_info_id
-        INNER JOIN stock_out_record sor
-            ON sor.record_id = si.id
-           AND sor.record_type = '13'
-           AND sor.approval_status IN (0, 1, 3)
-        INNER JOIN stock_inventory inv
-            ON inv.id = spd.stock_inventory_id
-        GROUP BY inv.batch_no, inv.product_model_id
-    ) so ON so.product_model_id = sir.product_model_id
-       AND (so.batch_no = sir.batch_no OR (so.batch_no IS NULL AND sir.batch_no IS NULL))
+    LEFT JOIN (SELECT stock_in_record_id,
+                      SUM(return_quantity) AS total_return_num1
+               FROM purchase_return_order_products
+               WHERE 1 = 1 and purchase_return_order_id = #{id}
+               GROUP BY stock_in_record_id) rs1 ON rs1.stock_in_record_id = sir.id
     where pro.id = #{id}
     </select>
 </mapper>
diff --git a/src/main/resources/mapper/quality/QualityInspectMapper.xml b/src/main/resources/mapper/quality/QualityInspectMapper.xml
index ed01cad..cb6e67a 100644
--- a/src/main/resources/mapper/quality/QualityInspectMapper.xml
+++ b/src/main/resources/mapper/quality/QualityInspectMapper.xml
@@ -4,6 +4,10 @@
     <select id="qualityInspectListPage" resultType="com.ruoyi.quality.dto.QualityInspectDto">
         SELECT
         qi.*,
+        CASE
+            WHEN (IFNULL(qi.qualified_quantity, 0) + IFNULL(qi.unqualified_quantity, 0)) = 0 THEN 0
+            ELSE ROUND(IFNULL(qi.qualified_quantity, 0) / (IFNULL(qi.qualified_quantity, 0) + IFNULL(qi.unqualified_quantity, 0)) * 100, 2)
+        END AS passRate,
         <choose>
             <when test="qualityInspect.inspectType == 0">
                 pl.purchase_contract_number as purchase_contract_no
@@ -54,21 +58,16 @@
         <if test="qualityInspect.entryDateEnd != null and qualityInspect.entryDateEnd != '' ">
             AND qi.check_time &lt;= DATE_FORMAT(#{qualityInspect.entryDateEnd},'%Y-%m-%d')
         </if>
-        <if test="qualityInspect.purchaseContractNo != null and qualityInspect.purchaseContractNo != '' ">
-            AND pl.purchase_contract_number like concat('%',#{qualityInspect.purchaseContractNo},'%')
-        </if>
-        <if test="qualityInspect.workOrderNo != null and qualityInspect.workOrderNo != '' ">
-            AND pot.work_order_no like concat('%',#{qualityInspect.workOrderNo},'%')
-        </if>
-        <if test="qualityInspect.salesContractNo != null and qualityInspect.salesContractNo != '' ">
-            AND po_sales.sales_contract_no like concat('%',#{qualityInspect.salesContractNo},'%')
-        </if>
-        ORDER BY qi.check_time DESC
+        ORDER BY coalesce(qi.check_time, qi.create_time) DESC
     </select>
 
     <select id="qualityInspectExport" resultType="com.ruoyi.quality.pojo.QualityInspect">
         SELECT
-        *
+        qi.*,
+        CASE
+            WHEN (IFNULL(qi.qualified_quantity, 0) + IFNULL(qi.unqualified_quantity, 0)) = 0 THEN 0
+            ELSE ROUND(IFNULL(qi.qualified_quantity, 0) / (IFNULL(qi.qualified_quantity, 0) + IFNULL(qi.unqualified_quantity, 0)) * 100, 2)
+        END AS passRate
         FROM quality_inspect
         where
         inspect_type=#{qualityInspect.inspectType}
@@ -95,11 +94,7 @@
     </delete>
 
     <select id="getInspectStatistics" resultType="com.ruoyi.quality.dto.QualityInspectStatDto">
-        SELECT CASE pp.product_name
-                   WHEN '鍘熸潗鏂�' THEN 0
-                   WHEN '鍗婃垚鍝�' THEN 1
-                   WHEN '鎴愬搧' THEN 2
-                   END                     AS modelType,
+        SELECT qi.inspect_type AS modelType,
 
                IFNULL(SUM(qi.quantity), 0) AS totalCount,
 
@@ -108,104 +103,44 @@
                               ELSE 0
                    END), 0)                AS completedCount
 
-        FROM product p
-                 INNER JOIN product pp
-                            ON p.parent_id = pp.id
-                 LEFT JOIN product_model pm
-                           ON pm.product_id = p.id
-                 LEFT JOIN quality_inspect qi
-                           ON qi.product_model_id = pm.id
+        FROM quality_inspect qi
 
-        WHERE pp.product_name IN ('鍘熸潗鏂�', '鍗婃垚鍝�', '鎴愬搧')
-
-        GROUP BY pp.product_name
+        GROUP BY qi.inspect_type
 
     </select>
 
     <select id="getPassRateStatistics" resultType="com.ruoyi.quality.dto.QualityPassRateDto">
         SELECT t.modelType,
+               t.totalCount,
+               t.completedCount,
+               t.qualifiedCount,
+               t.unqualifiedCount,
 
-               COALESCE(SUM(qi.quantity), 0) AS totalCount,
+            /* 瀹屾垚鐜囷細
+               濡傛灉鎬绘暟涓� 0 鍒欒繑鍥� 0锛涘惁鍒欒绠楁瘮渚嬶紝浣跨敤 TRUNCATE 淇濈暀 4 浣嶅皬鏁帮紙濡� 99.9992锛�
+            */
+               IF(t.totalCount = 0, 0,
+                  TRUNCATE((t.completedCount / t.totalCount) * 100, 2)
+               ) AS completionRate,
 
-               COALESCE(SUM(
-                                CASE
-                                    WHEN qi.inspect_state = 1 THEN qi.quantity
-                                    ELSE 0
-                                    END
-                        ), 0)                AS completedCount,
-
-               COALESCE(SUM(
-                                CASE
-                                    WHEN qi.inspect_state = 1
-                                        THEN qi.qualified_quantity
-                                    ELSE 0
-                                    END
-                        ), 0)                AS qualifiedCount,
-
-               COALESCE(SUM(
-                                CASE
-                                    WHEN qi.inspect_state = 1
-                                        THEN qi.unqualified_quantity
-                                    ELSE 0
-                                    END
-                        ), 0)                AS unqualifiedCount,
-
-            /* 瀹屾垚鐜� */
-               IF(COALESCE(SUM(qi.quantity), 0) = 0, 0,
-                  ROUND(
-                          COALESCE(SUM(
-                                           CASE
-                                               WHEN qi.inspect_state = 1 THEN qi.quantity
-                                               ELSE 0
-                                               END
-                                   ), 0)
-                              / SUM(qi.quantity) * 100, 2)
-               )                             AS completionRate,
-
-            /* 鍚堟牸鐜� */
-               IF(COALESCE(SUM(
-                                   CASE
-                                       WHEN qi.inspect_state = 1 THEN qi.quantity
-                                       ELSE 0
-                                       END
-                           ), 0) = 0, 0,
-                  ROUND(
-                          COALESCE(SUM(
-                                           CASE
-                                               WHEN qi.inspect_state = 1
-                                                   THEN qi.qualified_quantity
-                                               ELSE 0
-                                               END
-                                   ), 0)
-                              /
-                          COALESCE(SUM(
-                                           CASE
-                                               WHEN qi.inspect_state = 1 THEN qi.quantity
-                                               ELSE 0
-                                               END
-                                   ), 0) * 100, 2)
-               )                             AS passRate
-
-        FROM (SELECT 0 AS modelType
-              UNION ALL
-              SELECT 1
-              UNION ALL
-              SELECT 2) t
-                 LEFT JOIN product p
-                           ON 1 = 1
-                 LEFT JOIN product pp
-                           ON p.parent_id = pp.id
-                 LEFT JOIN product_model pm
-                           ON pm.product_id = p.id
-                 LEFT JOIN quality_inspect qi
-                           ON qi.product_model_id = pm.id
-                               AND (
-                                  (pp.product_name = '鍘熸潗鏂�' AND t.modelType = 0) OR
-                                  (pp.product_name = '鍗婃垚鍝�' AND t.modelType = 1) OR
-                                  (pp.product_name = '鎴愬搧' AND t.modelType = 2)
-                                  )
-
-        GROUP BY t.modelType
+            /* 鍚堟牸鐜囷細
+               濡傛灉瀹屽伐鏁颁负 0 鍒欒繑鍥� 0锛涗娇鐢� TRUNCATE 鎴柇锛岄槻姝㈡瀬鍏舵帴杩� 100% 鐨勬暟鎹鍥涜垗浜斿叆鎴� 100
+            */
+               IF(t.completedCount = 0, 0,
+                  TRUNCATE((t.qualifiedCount / t.completedCount) * 100, 2)
+               ) AS passRate
+        FROM (
+                 /* 鍏堥�氳繃瀛愭煡璇㈡妸鍩虹鏁版嵁杩涜鑱氬悎缁熻锛岄伩鍏嶅灞傞噸澶嶇紪鍐欏鏉傜殑 CASE WHEN */
+                 SELECT qi.inspect_type                                                                          AS modelType,
+                        COALESCE(SUM(qi.quantity), 0)                                                            AS totalCount,
+                        COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END),
+                                 0)                                                                              AS completedCount,
+                        COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.qualified_quantity ELSE 0 END),
+                                 0)                                                                              AS qualifiedCount,
+                        COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.unqualified_quantity ELSE 0 END),
+                                 0)                                                                              AS unqualifiedCount
+                 FROM quality_inspect qi
+                 GROUP BY qi.inspect_type) t
         ORDER BY t.modelType;
     </select>
 
@@ -226,45 +161,74 @@
                      FROM months m
                               CROSS JOIN types t)
 
-        SELECT CASE b.month_num
-                   WHEN 1 THEN '涓�鏈�'
-                   WHEN 2 THEN '浜屾湀'
-                   WHEN 3 THEN '涓夋湀'
-                   WHEN 4 THEN '鍥涙湀'
-                   WHEN 5 THEN '浜旀湀'
-                   WHEN 6 THEN '鍏湀'
-                   WHEN 7 THEN '涓冩湀'
-                   WHEN 8 THEN '鍏湀'
-                   WHEN 9 THEN '涔濇湀'
-                   WHEN 10 THEN '鍗佹湀'
-                   WHEN 11 THEN '鍗佷竴鏈�'
-                   WHEN 12 THEN '鍗佷簩鏈�'
-                   END                       AS month,
+        SELECT
+            CASE t.month_num
+                WHEN 1 THEN '涓�鏈�'
+                WHEN 2 THEN '浜屾湀'
+                WHEN 3 THEN '涓夋湀'
+                WHEN 4 THEN '鍥涙湀'
+                WHEN 5 THEN '浜旀湀'
+                WHEN 6 THEN '鍏湀'
+                WHEN 7 THEN '涓冩湀'
+                WHEN 8 THEN '鍏湀'
+                WHEN 9 THEN '涔濇湀'
+                WHEN 10 THEN '鍗佹湀'
+                WHEN 11 THEN '鍗佷竴鏈�'
+                WHEN 12 THEN '鍗佷簩鏈�'
+                END AS month,
 
-               b.modelType,
+        t.modelType,
+        t.totalCount,
+        t.completedCount,
+        t.qualifiedCount,
+        t.unqualifiedCount,
 
-            /* 鎬绘暟閲� */
+        IF(t.totalCount = 0, 0,
+           TRUNCATE((t.completedCount / t.totalCount) * 100, 2)
+        ) AS completionRate,
+
+        IF(t.completedCount = 0, 0,
+           TRUNCATE((t.qualifiedCount / t.completedCount) * 100, 2)
+        ) AS passRate
+
+        FROM (
+            SELECT
+            b.month_num,
+            b.modelType,
+            COALESCE(SUM(qi.quantity), 0) AS totalCount,
+            COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END), 0) AS completedCount,
+            COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.qualified_quantity ELSE 0 END), 0) AS qualifiedCount,
+            COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.unqualified_quantity ELSE 0 END), 0) AS unqualifiedCount
+            FROM base b
+            LEFT JOIN quality_inspect qi ON qi.inspect_type = b.modelType
+            AND YEAR(qi.check_time) = #{year}
+            AND MONTH(qi.check_time) = b.month_num
+            GROUP BY b.month_num, b.modelType
+            ) t
+        ORDER BY t.month_num, t.modelType;
+    </select>
+    <select id="getYearlyPassRateStatistics" resultType="com.ruoyi.quality.dto.QualityPassRateDto">
+        SELECT qi.inspect_type AS modelType,
+
                COALESCE(SUM(qi.quantity), 0) AS totalCount,
 
-            /* 宸插畬鎴� */
-               COALESCE(SUM(
-                                CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END
-                        ), 0)                AS completedCount,
-
-            /* 鍚堟牸 */
                COALESCE(SUM(
                                 CASE
-                                    WHEN qi.inspect_state = 1
-                                        THEN qi.qualified_quantity
+                                    WHEN qi.inspect_state = 1 THEN qi.quantity
+                                    ELSE 0
+                                    END
+                        ), 0)                AS completedCount,
+
+               COALESCE(SUM(
+                                CASE
+                                    WHEN qi.inspect_state = 1 THEN qi.qualified_quantity
                                     ELSE 0
                                     END
                         ), 0)                AS qualifiedCount,
 
-            /* 涓嶅悎鏍� */
                COALESCE(SUM(
                                 CASE
-                                    WHEN qi.inspect_state = 1
-                                        THEN qi.unqualified_quantity
+                                    WHEN qi.inspect_state = 1 THEN qi.unqualified_quantity
                                     ELSE 0
                                     END
                         ), 0)                AS unqualifiedCount,
@@ -274,8 +238,8 @@
                   ROUND(
                           COALESCE(SUM(
                                            CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END
-                                   ), 0) / SUM(qi.quantity) * 100, 2
-                  )
+                                   ), 0)
+                              / SUM(qi.quantity) * 100, 2)
                )                             AS completionRate,
 
             /* 鍚堟牸鐜� */
@@ -284,78 +248,18 @@
                            ), 0) = 0, 0,
                   ROUND(
                           COALESCE(SUM(
-                                           CASE
-                                               WHEN qi.inspect_state = 1
-                                                   THEN qi.qualified_quantity
-                                               ELSE 0
-                                               END
+                                           CASE WHEN qi.inspect_state = 1 THEN qi.qualified_quantity ELSE 0 END
                                    ), 0)
                               /
                           COALESCE(SUM(
                                            CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END
-                                   ), 0) * 100, 2
-                  )
+                                   ), 0) * 100, 2)
                )                             AS passRate
 
-        FROM base b
-                 LEFT JOIN product p ON 1 = 1
-                 LEFT JOIN product pp ON p.parent_id = pp.id
-                 LEFT JOIN product_model pm ON pm.product_id = p.id
-                 LEFT JOIN quality_inspect qi
-                           ON qi.product_model_id = pm.id
-                               AND YEAR(qi.check_time) = #{year}
-                               AND MONTH(qi.check_time) = b.month_num
-                               AND (
-                                  (pp.product_name = '鍘熸潗鏂�' AND b.modelType = 0)
-                                      OR (pp.product_name = '鍗婃垚鍝�' AND b.modelType = 1)
-                                      OR (pp.product_name = '鎴愬搧' AND b.modelType = 2)
-                                  )
-
-        GROUP BY b.month_num, b.modelType
-        ORDER BY b.month_num, b.modelType;
-
-    </select>
-
-    <select id="getYearlyPassRateStatistics" resultType="com.ruoyi.quality.dto.QualityPassRateDto">
-        SELECT t.modelType,
-               COALESCE(SUM(
-                                CASE
-                                    WHEN pp.product_name = '鍘熸潗鏂�' AND t.modelType = 0 THEN qi.quantity
-                                    WHEN pp.product_name = '鍗婃垚鍝�' AND t.modelType = 1 THEN qi.quantity
-                                    WHEN pp.product_name = '鎴愬搧' AND t.modelType = 2 THEN qi.quantity
-                                    ELSE 0
-                                    END
-                        ), 0) AS totalCount,
-               COALESCE(SUM(
-                                CASE
-                                    WHEN pp.product_name = '鍘熸潗鏂�' AND t.modelType = 0 THEN qi.qualified_quantity
-                                    WHEN pp.product_name = '鍗婃垚鍝�' AND t.modelType = 1 THEN qi.qualified_quantity
-                                    WHEN pp.product_name = '鎴愬搧' AND t.modelType = 2 THEN qi.qualified_quantity
-                                    ELSE 0
-                                    END
-                        ), 0) AS qualifiedCount,
-               COALESCE(SUM(
-                                CASE
-                                    WHEN pp.product_name = '鍘熸潗鏂�' AND t.modelType = 0 THEN qi.unqualified_quantity
-                                    WHEN pp.product_name = '鍗婃垚鍝�' AND t.modelType = 1 THEN qi.unqualified_quantity
-                                    WHEN pp.product_name = '鎴愬搧' AND t.modelType = 2 THEN qi.unqualified_quantity
-                                    ELSE 0
-                                    END
-                        ), 0) AS unqualifiedCount
-        FROM (SELECT 0 AS modelType
-              UNION ALL
-              SELECT 1
-              UNION ALL
-              SELECT 2) t
-                 LEFT JOIN product p ON 1 = 1
-                 LEFT JOIN product pp ON p.parent_id = pp.id
-                 LEFT JOIN product_model pm ON pm.product_id = p.id
-                 LEFT JOIN quality_inspect qi
-                           ON qi.product_model_id = pm.id
-                               AND YEAR(qi.check_time) = #{year}
-                               AND qi.inspect_state = 1
-        GROUP BY t.modelType
-        ORDER BY t.modelType;
+        FROM quality_inspect qi
+        WHERE YEAR(qi.check_time) = #{year}
+        GROUP BY qi.inspect_type
+        ORDER BY qi.inspect_type;
     </select>
 
 
@@ -384,7 +288,7 @@
             /* 鍘熸潗鏂� */
                COALESCE(SUM(
                                 CASE
-                                    WHEN pp.product_name = '鍘熸潗鏂�'
+                                    WHEN qi.inspect_type = 0
                                         THEN qi.quantity
                                     ELSE 0
                                     END
@@ -393,7 +297,7 @@
             /* 鍗婃垚鍝� */
                COALESCE(SUM(
                                 CASE
-                                    WHEN pp.product_name = '鍗婃垚鍝�'
+                                    WHEN qi.inspect_type = 1
                                         THEN qi.quantity
                                     ELSE 0
                                     END
@@ -402,19 +306,15 @@
             /* 鎴愬搧 */
                COALESCE(SUM(
                                 CASE
-                                    WHEN pp.product_name = '鎴愬搧'
+                                    WHEN qi.inspect_type = 2
                                         THEN qi.quantity
                                     ELSE 0
                                     END
                         ), 0) AS outgoingCount
 
         FROM months m
-                 LEFT JOIN product p ON 1 = 1
-                 LEFT JOIN product pp ON p.parent_id = pp.id
-                 LEFT JOIN product_model pm ON pm.product_id = p.id
                  LEFT JOIN quality_inspect qi
-                           ON qi.product_model_id = pm.id
-                               AND qi.inspect_state = 1
+                           ON qi.inspect_state = 1
                                AND YEAR(qi.check_time) = #{year}
                                AND MONTH(qi.check_time) = m.month_num
 
@@ -429,16 +329,8 @@
                                   FROM quality_inspect_param qip
                                            JOIN quality_inspect qi
                                                 ON qip.inspect_id = qi.id
-                                           JOIN product p
-                                                ON qi.product_id = p.id
-                                           JOIN product pp
-                                                ON p.parent_id = pp.id
                                   WHERE qi.inspect_state = 1
-                                    AND (
-                                      (#{modelType} = 1 AND pp.product_name = '鍘熸潗鏂�')
-                                          OR (#{modelType} = 2 AND pp.product_name = '鍗婃垚鍝�')
-                                          OR (#{modelType} = 3 AND pp.product_name = '鎴愬搧')
-                                      )
+                                    AND qi.inspect_type = #{modelType} - 1
                                   GROUP BY qip.parameter_item),
              ranked AS (SELECT name,
                                count,
diff --git a/src/main/resources/mapper/quality/QualityTestStandardMapper.xml b/src/main/resources/mapper/quality/QualityTestStandardMapper.xml
index 53eef84..f326a66 100644
--- a/src/main/resources/mapper/quality/QualityTestStandardMapper.xml
+++ b/src/main/resources/mapper/quality/QualityTestStandardMapper.xml
@@ -19,7 +19,6 @@
         <if test="c.inspectType != null ">
             AND inspect_type =#{c.inspectType}
         </if>
-        order by create_time desc
     </select>
     <select id="getQualityTestStandardByProductId" resultType="com.ruoyi.quality.pojo.QualityTestStandard">
         SELECT qts.*
diff --git a/src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml b/src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml
index d995258..df2d565 100644
--- a/src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml
+++ b/src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml
@@ -26,25 +26,26 @@
         END AS method
         FROM quality_unqualified qu
         LEFT JOIN product_model pm ON qu.model = pm.id
-        <where>
-            <if test="qualityUnqualified.inspectType != null ">
-                AND inspect_type = #{qualityUnqualified.inspectType}
-            </if>
-            <if test="qualityUnqualified.inspectState != null ">
-                AND inspect_state = #{qualityUnqualified.inspectState}
-            </if>
-            <if test="qualityUnqualified.productName != null and qualityUnqualified.productName != '' ">
-                AND product_name = #{qualityUnqualified.productName}
-            </if>
-            <if test="qualityUnqualified.entryDateStart != null and qualityUnqualified.entryDateStart != '' ">
-                AND check_time &gt;= DATE_FORMAT(#{qualityUnqualified.entryDateStart},'%Y-%m-%d')
-            </if>
-            <if test="qualityUnqualified.entryDateEnd != null and qualityUnqualified.entryDateEnd != '' ">
-                AND  check_time &lt;= DATE_FORMAT(#{qualityUnqualified.entryDateEnd},'%Y-%m-%d')
-            </if>
-        </where>
-        order by qu.create_time desc
+        where
+        1=1
+        <if test="qualityUnqualified.inspectType != null ">
+            AND inspect_type = #{qualityUnqualified.inspectType}
+        </if>
+        <if test="qualityUnqualified.inspectState != null ">
+            AND inspect_state = #{qualityUnqualified.inspectState}
+        </if>
+        <if test="qualityUnqualified.productName != null and qualityUnqualified.productName != '' ">
+            AND product_name = #{qualityUnqualified.productName}
+        </if>
+        <if test="qualityUnqualified.entryDateStart != null and qualityUnqualified.entryDateStart != '' ">
+            AND check_time &gt;= DATE_FORMAT(#{qualityUnqualified.entryDateStart},'%Y-%m-%d')
+        </if>
+        <if test="qualityUnqualified.entryDateEnd != null and qualityUnqualified.entryDateEnd != '' ">
+            AND  check_time &lt;= DATE_FORMAT(#{qualityUnqualified.entryDateEnd},'%Y-%m-%d')
+        </if>
+        order by qu.check_time desc
     </select>
+
     <select id="qualityUnqualifiedExport" resultType="com.ruoyi.quality.pojo.QualityUnqualified">
         SELECT
         *
diff --git a/src/main/resources/mapper/sales/SalesLedgerMapper.xml b/src/main/resources/mapper/sales/SalesLedgerMapper.xml
index 2d6b7f8..ed6c26c 100644
--- a/src/main/resources/mapper/sales/SalesLedgerMapper.xml
+++ b/src/main/resources/mapper/sales/SalesLedgerMapper.xml
@@ -56,7 +56,6 @@
         T1.attachment_materials,
         T1.tenant_id,
         T1.contract_amount,
-        T1.net_contract_amount,
         T1.contract_amount AS noInvoiceAmountTotal,
         T1.execution_date,
         T2.nick_name AS entry_person_name,
@@ -96,7 +95,7 @@
                 AND T1.entry_date &lt;= DATE_FORMAT(#{salesLedgerDto.entryDateEnd},'%Y-%m-%d')
             </if>
         </where>
-        order by T1.entry_date desc
+        order by T1.entry_date desc, T1.sales_contract_no desc
     </select>
 
     <select id="selectIncomeStats" resultType="com.ruoyi.home.dto.IncomeExpenseAnalysisDto">
@@ -111,17 +110,19 @@
         FROM sales_ledger
         GROUP BY customer_name
     </select>
+
     <select id="listSalesLedgerAndShipped" resultType="com.ruoyi.sales.dto.SalesLedgerDto">
         select distinct sl.id as 'disId', sl.* from
         sales_ledger sl
         left join sales_ledger_product slp on sl.id = slp.sales_ledger_id
         left join shipping_info si on slp.id = si.sales_ledger_product_id
-        where si.status = '宸插彂璐�'
-        <if test="ew.customerName != null and ew.customerName != '' ">
-            and sl.customer_name like concat('%',#{ew.customerName},'%')
+        where si.status = '瀹℃牳閫氳繃'
+        <if test="ew.customerId != null and ew.customerId != '' ">
+            and sl.customer_id = #{ew.customerId}
         </if>
         order by sl.execution_date desc
     </select>
+
     <select id="selectPurchaseReportVoPage" resultType="com.ruoyi.purchase.vo.PurchaseReportVo">
         select sl.sales_contract_no customerContractNo,
                c.customer_name,
@@ -133,12 +134,10 @@
         from sales_ledger sl
         left join purchase_ledger pl on sl.id = pl.sales_ledger_id
         left join customer c on sl.customer_id = c.id
-        <where>
-            <if test="customerName != null and customerName != '' ">
-                and c.customer_name like concat('%',#{customerName},'%')
-            </if>
-        </where>
-        order by sl.entry_date desc
+        where 1=1
+        <if test="customerName != null and customerName != '' ">
+            and c.customer_name like concat('%',#{customerName},'%')
+        </if>
     </select>
 
 </mapper>
diff --git a/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
index 9e6839f..23cad89 100644
--- a/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
+++ b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -30,17 +30,12 @@
         pm.model as specification_model,
         pm.unit as unit,
         CASE
-        WHEN (IFNULL(t2.qualitity, 0) - IFNULL(t2.locked_quantity, 0)) >0 THEN 1
+        WHEN (IFNULL(t2.qualitity, 0) - IFNULL(t2.locked_quantity, 0)) >= (IFNULL(T1.quantity, 0) - IFNULL(t3.shipped_quantity, 0)) THEN 1
         ELSE 0
         END as has_sufficient_stock,
-        (IFNULL(T1.quantity, 0) - IFNULL(t3.shipped_quantity, 0) - IFNULL(t5.pending_approval_quantity, 0)) as no_quantity,
-        IFNULL(t3.shipped_quantity, 0) as shipped_quantity,
-        IFNULL(t6.return_quantity, 0) as return_quantity,
-        IFNULL(t4.approved_stock_in_num, 0) as approved_stock_in_num,
-        IFNULL(t5.pending_approval_quantity, 0) as pending_approval_quantity,
+        (IFNULL(T1.quantity, 0) - IFNULL(t3.shipped_quantity, 0)) as no_quantity,
         CASE
-         WHEN IFNULL(t3.shipped_quantity, 0) = 0 AND IFNULL(t5.pending_approval_quantity, 0) = 0 THEN '寰呭彂璐�'
-         WHEN IFNULL(t3.shipped_quantity, 0) = 0 AND IFNULL(t5.pending_approval_quantity, 0) > 0 THEN '瀹℃壒涓�'
+         WHEN IFNULL(t3.shipped_quantity, 0) = 0 THEN '寰呭彂璐�'
          WHEN (IFNULL(T1.quantity, 0) - IFNULL(t3.shipped_quantity, 0)) > 0 THEN '閮ㄥ垎鍙戣揣'
         ELSE '宸插彂璐�'
         END as shippingStatus,
@@ -58,60 +53,11 @@
         GROUP BY product_model_id
         ) t2 ON T1.product_model_id = t2.product_model_id
         LEFT JOIN (
-        SELECT
-            slp.id AS sales_ledger_product_id,
-            IFNULL(SUM(so.total_sale_out_num), 0) AS shipped_quantity
-        FROM sales_ledger_product slp
-        LEFT JOIN (
-            SELECT
-                pl.id AS purchase_ledger_id,
-                sir.product_model_id,
-                SUM(spd.quantity) AS total_sale_out_num
-            FROM shipping_product_detail spd
-            INNER JOIN shipping_info si
-                ON si.id = spd.shipping_info_id
-            INNER JOIN stock_out_record sor
-                ON sor.record_id = si.id
-               AND TRIM(sor.record_type) = '13'
-               AND sor.approval_status IN (0, 1, 3)
-            INNER JOIN stock_inventory inv
-                ON inv.id = spd.stock_inventory_id
-            INNER JOIN stock_in_record sir
-                ON sir.product_model_id = inv.product_model_id
-               AND (
-                    (sir.batch_no IS NOT NULL AND sir.batch_no = inv.batch_no)
-                    OR (sir.batch_no IS NULL AND inv.batch_no IS NULL)
-               )
-               AND sir.approval_status = 1
-               AND sir.record_type IN ('7', '10')
-            LEFT JOIN quality_inspect qi
-                ON sir.record_type = '10'
-               AND sir.record_id = qi.id
-            LEFT JOIN purchase_ledger pl
-                ON pl.id = IF(sir.record_type = '7', sir.record_id, qi.purchase_ledger_id)
-            WHERE si.status IN ('瀹℃牳閫氳繃', '宸插彂璐�')
-              AND pl.id IS NOT NULL
-            GROUP BY pl.id, sir.product_model_id
-        ) so ON so.purchase_ledger_id = slp.sales_ledger_id
-            AND so.product_model_id = slp.product_model_id
-        WHERE slp.type = 2
-        GROUP BY slp.id
-
-        UNION ALL
-
-        -- 閿�鍞彴璐�(type=1): shipping_info 鐩存帴鎸� sales_ledger_product_id,鍙粺璁″嚭搴撳鏍搁�氳繃(approval_status=1)鐨勫彂璐ч噺,涓� t5 鐨� pending 閫昏緫浜掕ˉ
-        SELECT
-            si.sales_ledger_product_id AS sales_ledger_product_id,
-            IFNULL(SUM(spd.quantity), 0) AS shipped_quantity
+        SELECT sales_ledger_product_id, IFNULL(SUM(spd.quantity), 0) as shipped_quantity
         FROM shipping_info si
-        INNER JOIN shipping_product_detail spd ON si.id = spd.shipping_info_id
-        INNER JOIN stock_out_record sor
-            ON sor.record_id = si.id
-           AND TRIM(sor.record_type) = '13'
-           AND sor.approval_status = 1
-        WHERE si.status IN ('瀹℃牳閫氳繃', '宸插彂璐�')
-          AND si.sales_ledger_product_id IS NOT NULL
-        GROUP BY si.sales_ledger_product_id
+        LEFT JOIN shipping_product_detail spd ON si.id = spd.shipping_info_id
+        where si.status != '瀹℃牳鎷掔粷'
+        GROUP BY sales_ledger_product_id
         ) t3 ON t3.sales_ledger_product_id = T1.id
         LEFT JOIN (
         SELECT rel.sales_ledger_product_id,
@@ -146,42 +92,6 @@
         ) rel
         GROUP BY rel.sales_ledger_product_id
         ) t4 ON t4.sales_ledger_product_id = T1.id
-        LEFT JOIN (
-        SELECT si.sales_ledger_product_id, IFNULL(SUM(spd.quantity), 0) as pending_approval_quantity
-        FROM shipping_info si
-        LEFT JOIN shipping_product_detail spd ON si.id = spd.shipping_info_id
-        WHERE si.status IN ('寰呭鏍�', '瀹℃牳涓�')
-           OR (si.status = '瀹℃牳閫氳繃' AND NOT EXISTS (
-                SELECT 1 FROM stock_out_record sor
-                WHERE sor.record_id = si.id
-                  AND TRIM(sor.record_type) = '13'
-                  AND sor.approval_status = 1
-           ))
-        GROUP BY si.sales_ledger_product_id
-        ) t5 ON t5.sales_ledger_product_id = T1.id
-        LEFT JOIN (
-            SELECT
-                prop.sales_ledger_product_id,
-                IFNULL(SUM(prop.return_quantity), 0) AS return_quantity
-            FROM purchase_return_order_products prop
-            LEFT JOIN purchase_return_orders pro
-                ON pro.id = prop.purchase_return_order_id
-            GROUP BY prop.sales_ledger_product_id
-
-            UNION ALL
-
-            SELECT
-                si.sales_ledger_product_id,
-                IFNULL(SUM(rsp.num), 0) AS return_quantity
-            FROM return_sale_product rsp
-            INNER JOIN return_management rm ON rm.id = rsp.return_management_id
-            INNER JOIN shipping_info si ON si.id = rm.shipping_id
-            INNER JOIN stock_in_record sir ON sir.record_id = rsp.id
-                AND TRIM(sir.record_type) IN ('14','15')
-                AND sir.approval_status = 1
-            WHERE si.sales_ledger_product_id IS NOT NULL
-            GROUP BY si.sales_ledger_product_id
-        ) t6 ON t6.sales_ledger_product_id = T1.id
         left join product_model pm ON T1.product_model_id = pm.id
         left join product p ON pm.product_id = p.id
         <where>
@@ -221,7 +131,7 @@
         SUM(slp.tax_inclusive_total_price) AS purchaseAmount,
         COUNT(DISTINCT slp.sales_ledger_id) AS purchaseTimes,
         <!-- 骞冲潎鍗曚环 = 鎬婚噰璐噾棰�/鎬婚噰璐暟閲忥紝淇濈暀2浣嶅皬鏁帮紝閬垮厤闄�0 -->
-        ROUND(IF(SUM(slp.quantity) = 0, 0, SUM(slp.tax_inclusive_total_price) / SUM(slp.quantity)), 2) AS averagePrice,
+        ROUND(IF(SUM(slp.quantity) = 0, 0, SUM(slp.tax_inclusive_total_price) / SUM(slp.quantity)), 6) AS averagePrice,
         <!-- 璇ヤ骇鍝佸ぇ绫讳笅鏈�鍚庝竴涓綍鍏ユ棩鏈燂紙鍙栧彴璐︿富琛ㄧ殑entry_date锛� -->
         MAX(sl.entry_date) AS entryDate,
         COALESCE(NULLIF(SUM(t1.return_quantity), 0), 0) AS return_quantity,
@@ -297,7 +207,7 @@
             JOIN product pr ON slp.product_id = pr.id
         WHERE
             slp.type = 2
-            AND pr.parent_id = ( SELECT id FROM product WHERE product_name = '鍘熸潗鏂�' )
+            AND pr.parent_id = ( SELECT id FROM product WHERE product_name = '鍘熸枡' )
         GROUP BY
             pr.id,
             pr.product_name
@@ -308,20 +218,36 @@
 
     <select id="selectProductCountByTypeAndDate" resultType="int">
         SELECT IFNULL(COUNT(*), 0)
-        FROM sales_ledger_product
+        FROM sales_ledger_product slp
+        LEFT JOIN sales_ledger sl ON sl.id = slp.sales_ledger_id
+        LEFT JOIN purchase_ledger pl ON pl.id = slp.sales_ledger_id
         WHERE type = #{type}
-        <if test="startDate != null">
-            AND register_date &gt;= #{startDate}
-        </if>
-        <if test="endDate != null">
-            AND register_date &lt;= #{endDate}
-        </if>
+
+        <choose>
+            <when test="type == 1">
+                <if test="startDate != null">
+                    AND sl.entry_date &gt;= #{startDate}
+                </if>
+                <if test="endDate != null">
+                    AND sl.entry_date &lt;= #{endDate}
+                </if>
+            </when>
+
+            <when test="type == 2">
+                <if test="startDate != null">
+                    AND pl.entry_date &gt;= #{startDate}
+                </if>
+                <if test="endDate != null">
+                    AND pl.entry_date &lt;= #{endDate}
+                </if>
+            </when>
+        </choose>
     </select>
 
     <select id="selectRawMaterialExpense" resultType="java.math.BigDecimal">
         WITH RECURSIVE product_tree AS (SELECT id
                                         FROM product
-                                        WHERE product_name = '鍘熸潗鏂�'
+                                        WHERE product_name = '鍘熸枡'
 
                                         UNION ALL
 
diff --git a/src/main/resources/mapper/sales/SalesQuotationMapper.xml b/src/main/resources/mapper/sales/SalesQuotationMapper.xml
index 746e331..a407a0b 100644
--- a/src/main/resources/mapper/sales/SalesQuotationMapper.xml
+++ b/src/main/resources/mapper/sales/SalesQuotationMapper.xml
@@ -4,19 +4,21 @@
         "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 t1.*
+        SELECT t1.*,
+               t2.approve_user_ids
         FROM sales_quotation t1
-        <where>
-            <if test="salesQuotationDto.quotationNo != null and salesQuotationDto.quotationNo != '' ">
-                AND t1.quotation_no LIKE CONCAT('%',#{salesQuotationDto.quotationNo},'%')
-            </if>
-            <if test="salesQuotationDto.customer != null and salesQuotationDto.customer != '' ">
-                AND t1.customer = #{salesQuotationDto.customer}
-            </if>
-            <if test="salesQuotationDto.status != null and salesQuotationDto.status != '' ">
-                AND t1.status = #{salesQuotationDto.status}
-            </if>
-        </where>
-        order by t1.id desc
+        LEFT JOIN approve_process t2 ON t1.quotation_no = t2.approve_reason and t2.approve_type = 6
+        WHERE 1=1
+          and t2.approve_delete = 0
+        <if test="salesQuotationDto.quotationNo != null and salesQuotationDto.quotationNo != '' ">
+            AND t1.quotation_no LIKE CONCAT('%',#{salesQuotationDto.quotationNo},'%')
+        </if>
+        <if test="salesQuotationDto.customer != null and salesQuotationDto.customer != '' ">
+            AND t1.customer = #{salesQuotationDto.customer}
+        </if>
+        <if test="salesQuotationDto.status != null and salesQuotationDto.status != '' ">
+            AND t1.status = #{salesQuotationDto.status}
+        </if>
+        order by t1.quotation_no desc
     </select>
 </mapper>
diff --git a/src/main/resources/mapper/sales/ShippingInfoMapper.xml b/src/main/resources/mapper/sales/ShippingInfoMapper.xml
index 8775933..762c2d4 100644
--- a/src/main/resources/mapper/sales/ShippingInfoMapper.xml
+++ b/src/main/resources/mapper/sales/ShippingInfoMapper.xml
@@ -78,8 +78,7 @@
             sor.batch_no,
             slp.tax_inclusive_unit_price,
             GREATEST(sor.stock_out_num - COALESCE(rs.total_return_num, 0), 0) AS un_quantity,
-            COALESCE(rs.return_num, 0) AS total_return_num,
-            COALESCE(rs.pending_return_num, 0) AS pending_return_num
+            COALESCE(rs.total_return_num, 0) AS total_return_num
         FROM shipping_info si
         LEFT JOIN shipping_product_detail spd ON spd.shipping_info_id = si.id
         LEFT JOIN stock_out_record sor ON sor.record_id = si.id and sor.record_type = '13'
@@ -87,9 +86,7 @@
         LEFT JOIN (
         SELECT
         stock_out_record_id,
-        SUM(num) AS total_return_num,
-        SUM( CASE WHEN rsp.STATUS = 0 THEN rsp.num ELSE 0 END ) AS pending_return_num ,
-        SUM( CASE WHEN rsp.STATUS = 1 THEN rsp.num ELSE 0 END ) AS return_num
+        SUM(num) AS total_return_num
         FROM return_sale_product rsp
         left join return_management rm on rm.id = rsp.return_management_id
         left join shipping_info si on si.id = rm.shipping_id
@@ -104,9 +101,8 @@
         order by sor.id
     </select>
     <select id="getShippingInfoByCustomerName" resultType="com.ruoyi.sales.pojo.ShippingInfo">
-        select distinct si.* from shipping_info si
+        select * from shipping_info si
         left join sales_ledger sl on si.sales_ledger_id = sl.id
-        inner join stock_out_record sor on sor.record_id = si.id and sor.record_type = '13' and sor.approval_status = 1
-        where sl.customer_name = #{customerName} and si.status = '瀹℃牳閫氳繃'
+        where  sl.customer_name = #{customerName}
     </select>
 </mapper>
diff --git a/src/main/resources/mapper/staff/PersonalAttendanceRecordsMapper.xml b/src/main/resources/mapper/staff/PersonalAttendanceRecordsMapper.xml
index 4a15bbf..7dbb388 100644
--- a/src/main/resources/mapper/staff/PersonalAttendanceRecordsMapper.xml
+++ b/src/main/resources/mapper/staff/PersonalAttendanceRecordsMapper.xml
@@ -39,10 +39,9 @@
             and personal_attendance_records.date &gt;= #{params.date}
             and personal_attendance_records.date &lt; DATE_ADD(DATE(#{params.date}), INTERVAL 1 DAY)
         </if>
-        order by personal_attendance_records.id desc
     </select>
 
-    <!-- 鏌ヨ鎸囧畾鏃ユ湡鏈夋帓鐝紙闈炶鍋囷級浣嗘病鏈夎�冨嫟璁板綍鐨勫湪鑱屽憳宸ワ紝娌℃帓鐝涓轰紤鎭笉鏍囪缂哄嫟 -->
+    <!-- 鏌ヨ鎸囧畾鏃ユ湡娌℃湁鑰冨嫟璁板綍鐨勫湪鑱屽憳宸ワ紙鍦ㄦ寚瀹氭椂闂翠箣鍓嶅叆鑱岀殑锛� -->
     <select id="selectStaffWithoutAttendanceRecordBeforeTime" resultType="com.ruoyi.staff.pojo.StaffOnJob">
         SELECT soj.*
         FROM staff_on_job soj
@@ -50,11 +49,8 @@
         AND soj.create_time &lt; #{entryDeadline}
         AND EXISTS (
         SELECT 1
-        FROM personal_shift ps
-        WHERE ps.staff_on_job_id = soj.id
-        AND DATE(ps.work_time) = #{date}
-        AND ps.personal_attendance_location_config_id IS NOT NULL
-        AND ps.personal_attendance_location_config_id != 999
+        FROM personal_attendance_location_config palc
+        WHERE palc.sys_dept_id = soj.sys_dept_id
         )
         AND NOT EXISTS (
         SELECT 1
diff --git a/src/main/resources/mapper/staff/PersonalShiftMapper.xml b/src/main/resources/mapper/staff/PersonalShiftMapper.xml
index b912e24..69bcae3 100644
--- a/src/main/resources/mapper/staff/PersonalShiftMapper.xml
+++ b/src/main/resources/mapper/staff/PersonalShiftMapper.xml
@@ -18,25 +18,22 @@
         u.id user_id
         FROM personal_shift s
         LEFT JOIN staff_on_job u ON u.id = s.staff_on_job_id
-        LEFT JOIN staff_leave sl ON sl.staff_on_job_id = u.id
         LEFT JOIN personal_attendance_location_config palc ON palc.id = s.personal_attendance_location_config_id
         <where>
-            u.id IS NOT NULL
             <if test="sysDeptId != null and sysDeptId != ''">
                 and u.sys_dept_id = #{sysDeptId}
             </if>
             <if test="time != null and time != ''">
                 and DATE_FORMAT(s.work_time, '%Y-%m') = DATE_FORMAT(#{time}, '%Y-%m')
-                AND (u.staff_state = 1 OR (u.staff_state = 0 AND sl.leave_date IS NOT NULL AND sl.leave_date >= DATE_FORMAT(#{time}, '%Y-%m-01')))
             </if>
             <if test="userName != null and userName != ''">
                 and u.staff_name like concat('%', #{userName}, '%')
             </if>
         </where>
         GROUP BY u.id, u.staff_name
-        ORDER BY MAX(s.create_time) desc
+        ORDER BY MAX(s.create_time)
     </select>
-
+   
     <select id="performanceShiftYear" resultType="java.util.Map">
          SELECT
          u.staff_name name,
@@ -46,12 +43,10 @@
         GROUP_CONCAT(DATE_FORMAT(s.work_time, '%c'), '锛�', IFNULL(palc.shift, '') order by s.work_time SEPARATOR ';') month_str
         FROM personal_shift s
         LEFT JOIN staff_on_job u ON u.id = s.staff_on_job_id
-        LEFT JOIN staff_leave sl ON sl.staff_on_job_id = u.id
-        LEFT JOIN personal_attendance_location_config palc ON palc.id = s.personal_attendance_location_config_id
+         LEFT JOIN personal_attendance_location_config palc ON palc.id = s.personal_attendance_location_config_id
          <where>
             <if test="time != null and time != ''">
                 and DATE_FORMAT(s.work_time, '%Y') = DATE_FORMAT(#{time}, '%Y' )
-                AND (u.staff_state = 1 OR (u.staff_state = 0 AND sl.leave_date IS NOT NULL AND sl.leave_date >= DATE_FORMAT(#{time}, '%Y-01-01')))
             </if>
             <if test="userName != null and userName != ''">
                 and u.staff_name like concat('%', #{userName}, '%')
@@ -71,12 +66,10 @@
         GROUP_CONCAT(DATE_FORMAT(s.work_time, '%c'), '锛�', IFNULL(palc.shift, '') order by s.work_time SEPARATOR ';') month_str
         FROM personal_shift s
         LEFT JOIN staff_on_job u ON u.id = s.staff_on_job_id
-        LEFT JOIN staff_leave sl ON sl.staff_on_job_id = u.id
         LEFT JOIN personal_attendance_location_config palc ON palc.id = s.personal_attendance_location_config_id
        <where>
         <if test="time != null and time != ''">
             and DATE_FORMAT(s.work_time, '%Y') = DATE_FORMAT(#{time}, '%Y' )
-            AND (u.staff_state = 1 OR (u.staff_state = 0 AND sl.leave_date IS NOT NULL AND sl.leave_date >= DATE_FORMAT(#{time}, '%Y-01-01')))
         </if>
         <if test="userName != null and userName != ''">
             and u.staff_name like concat('%', #{userName}, '%')
@@ -94,12 +87,10 @@
         GROUP_CONCAT(s.work_time, '锛�', IFNULL(palc.shift, ''), '锛�', s.id order by s.work_time SEPARATOR ';') AS shift_time, u.id user_id
         FROM personal_shift s
         LEFT JOIN staff_on_job u ON u.id = s.staff_on_job_id
-        LEFT JOIN staff_leave sl ON sl.staff_on_job_id = u.id
         LEFT JOIN personal_attendance_location_config palc ON palc.id = s.personal_attendance_location_config_id
         <where>
             <if test="time != null and time != ''">
                 and DATE_FORMAT(s.work_time, '%Y-%m') = DATE_FORMAT(#{time}, '%Y-%m' )
-                AND (u.staff_state = 1 OR (u.staff_state = 0 AND sl.leave_date IS NOT NULL AND sl.leave_date >= DATE_FORMAT(#{time}, '%Y-%m-01')))
             </if>
             <if test="userName != null and userName != ''">
                 and u.staff_name like concat('%', #{userName}, '%')
@@ -110,17 +101,6 @@
         </where>
         GROUP BY u.id
         order by s.create_time
-    </select>
-
-    <select id="existsAttendanceUsedByConfig" resultType="boolean">
-        SELECT EXISTS (
-            SELECT 1
-            FROM personal_shift ps
-            INNER JOIN personal_attendance_records par
-                ON par.staff_on_job_id = ps.staff_on_job_id
-               AND par.date = DATE(ps.work_time)
-            WHERE ps.personal_attendance_location_config_id = #{configId}
-        )
     </select>
 
 </mapper>
diff --git a/src/main/resources/mapper/staff/SchemeApplicableStaffMapper.xml b/src/main/resources/mapper/staff/SchemeApplicableStaffMapper.xml
index 78a2a98..1652dd6 100644
--- a/src/main/resources/mapper/staff/SchemeApplicableStaffMapper.xml
+++ b/src/main/resources/mapper/staff/SchemeApplicableStaffMapper.xml
@@ -25,20 +25,6 @@
         create_time DESC
     </select>
 
-    <!-- 鏍规嵁閮ㄩ棬ID鏌ヨ鏈�鏂扮ぞ淇濇柟妗� -->
-    <select id="selectLatestSchemeByDeptId" resultType="com.ruoyi.staff.pojo.SchemeApplicableStaff">
-        SELECT
-        <include refid="schemeColumns"/>
-        FROM
-        scheme_applicable_staff
-        WHERE
-        1 = 1
-        AND FIND_IN_SET(#{deptId}, dept_ids)
-        ORDER BY
-        create_time DESC
-        LIMIT 1
-    </select>
-
     <!-- 鏌ヨ鏂规瀵瑰簲鐨勬槑缁� -->
     <select id="selectDetailBySchemeId" resultType="com.ruoyi.staff.pojo.SchemeInsuranceDetail">
         SELECT
diff --git a/src/main/resources/mapper/staff/StaffLeaveMapper.xml b/src/main/resources/mapper/staff/StaffLeaveMapper.xml
index fef5c81..4637ff0 100644
--- a/src/main/resources/mapper/staff/StaffLeaveMapper.xml
+++ b/src/main/resources/mapper/staff/StaffLeaveMapper.xml
@@ -18,24 +18,18 @@
         soj.emergency_contact as emergencyContact,
         soj.emergency_contact_phone as emergencyContactPhone,
         sp.post_name as postName,
-        sd.dept_name as deptName,
-        se.education as first_study,
-        se.major as profession
+        sd.dept_name as deptName
         FROM staff_leave
-        LEFT JOIN staff_on_job soj ON soj.id = staff_leave.staff_on_job_id
-        LEFT JOIN sys_post sp ON sp.post_id = soj.sys_post_id
-        LEFT JOIN sys_dept sd ON sd.dept_id = soj.sys_dept_id
-        LEFT JOIN staff_education se ON se.staff_on_job_id = staff_leave.staff_on_job_id
-        AND se.id = (
-        SELECT MAX(se2.id)
-        FROM staff_education se2
-        WHERE se2.staff_on_job_id = staff_leave.staff_on_job_id
-        )
-        WHERE 1=1
+        LEFT JOIN
+        staff_on_job soj ON soj.id = staff_leave.staff_on_job_id
+        LEFT JOIN
+        sys_post sp ON sp.post_id = soj.sys_post_id
+        LEFT JOIN
+        sys_dept sd ON sd.dept_id = soj.sys_dept_id
+        where 1=1
         <if test="c.staffName != null and c.staffName != '' ">
             AND soj.staff_name LIKE CONCAT('%',#{c.staffName},'%')
         </if>
-        order by staff_leave.create_time desc
     </select>
     <select id="staffLeaveList" resultType="com.ruoyi.staff.dto.StaffLeaveDto">
         SELECT
@@ -62,12 +56,10 @@
         sys_post sp ON sp.post_id = soj.sys_post_id
         LEFT JOIN
         sys_dept sd ON sd.dept_id = soj.sys_dept_id
-        <where>
-            <if test="c.staffName != null and c.staffName != '' ">
-                AND soj.staff_name LIKE CONCAT('%',#{c.staffName},'%')
-            </if>
-        </where>
-        order by staff_leave.create_time desc
+        where 1=1
+        <if test="c.staffName != null and c.staffName != '' ">
+            AND soj.staff_name LIKE CONCAT('%',#{c.staffName},'%')
+        </if>
     </select>
 
     <select id="staffLeaveReasonAnalytics" resultType="com.ruoyi.staff.dto.StaffLeaveDto">
diff --git a/src/main/resources/mapper/staff/StaffOnJobMapper.xml b/src/main/resources/mapper/staff/StaffOnJobMapper.xml
index 90825e3..a256ff8 100644
--- a/src/main/resources/mapper/staff/StaffOnJobMapper.xml
+++ b/src/main/resources/mapper/staff/StaffOnJobMapper.xml
@@ -3,83 +3,29 @@
 <mapper namespace="com.ruoyi.staff.mapper.StaffOnJobMapper">
     <select id="staffOnJobListPage" resultType="com.ruoyi.staff.dto.StaffOnJobDto">
         SELECT
-        staff_on_job.id,
-        staff_on_job.staff_state,
-        staff_on_job.staff_no,
-        staff_on_job.staff_name,
-        staff_on_job.sex,
-        staff_on_job.native_place,
-        staff_on_job.sys_post_id,
-        staff_on_job.sys_dept_id,
-        staff_on_job.role_id,
-        staff_on_job.adress,
-        staff_on_job.first_study,
-        staff_on_job.profession,
-        staff_on_job.identity_card,
-        staff_on_job.age,
-        staff_on_job.phone,
-        staff_on_job.contract_term,
-        staff_on_job.contract_expire_time,
-        staff_on_job.trial_end_date,
-        staff_on_job.trial_start_date,
-        staff_on_job.sign_date,
-        staff_on_job.salary_select,
-        staff_on_job.pro_salary,
-        staff_on_job.date_select,
-        staff_on_job.remark,
-        staff_on_job.create_time,
-        staff_on_job.create_user,
-        staff_on_job.update_time,
-        staff_on_job.update_user,
-        staff_on_job.tenant_id,
-        staff_on_job.alias,
-        staff_on_job.birth_date,
-        staff_on_job.nation,
-        staff_on_job.marital_status,
-        staff_on_job.pro_term,
-        staff_on_job.positive_date,
-        staff_on_job.basic_salary,
-        staff_on_job.dept_id,
-        sp.post_name AS post_name,
-        sd.dept_name AS dept_name,
-        MIN(t1.contract_start_time) AS contract_start_time,
-        MAX(t1.contract_end_time) AS contract_end_time,
-        (
-        SELECT GROUP_CONCAT(sec.contact_name SEPARATOR ',')
-        FROM staff_emergency_contact sec
-        WHERE sec.staff_on_job_id = staff_on_job.id
-        ) AS emergency_contact,
-        (
-        SELECT GROUP_CONCAT(sec.contact_phone SEPARATOR ',')
-        FROM staff_emergency_contact sec
-        WHERE sec.staff_on_job_id = staff_on_job.id
-        ) AS emergency_contact_phone
+        staff_on_job.*,
+        sp.post_name as postName,
+        sd.dept_name as deptName,
+        MIN(t1.contract_start_time) as contract_start_time,  -- 鍙栨渶鏃╁悎鍚屽紑濮嬫椂闂�
+        MAX(t1.contract_end_time) as contract_end_time
         FROM staff_on_job
         LEFT JOIN sys_post sp ON sp.post_id = staff_on_job.sys_post_id
         LEFT JOIN sys_dept sd ON sd.dept_id = staff_on_job.sys_dept_id
-        LEFT JOIN staff_contract AS t1 ON t1.staff_on_job_id = staff_on_job.id
-        <where>
-            <if test="staffOnJob.staffState != null">
-                AND staff_on_job.staff_state = #{staffOnJob.staffState}
-            </if>
-            <if test="staffOnJob.staffName != null and staffOnJob.staffName != '' ">
-                AND staff_on_job.staff_name LIKE CONCAT('%',#{staffOnJob.staffName},'%')
-            </if>
-            <if test="staffOnJob.entryDateStart != null and staffOnJob.entryDateStart != '' ">
-                AND staff_on_job.contract_expire_time &gt;= DATE_FORMAT(#{staffOnJob.entryDateStart},'%Y-%m-%d')
-            </if>
-            <if test="staffOnJob.entryDateEnd != null and staffOnJob.entryDateEnd != '' ">
-                AND staff_on_job.contract_expire_time &lt;= DATE_FORMAT(#{staffOnJob.entryDateEnd},'%Y-%m-%d')
-            </if>
-            <if test="staffOnJob.sysDeptId != null">
-                AND staff_on_job.sys_dept_id = #{staffOnJob.sysDeptId}
-            </if>
-        </where>
-        GROUP BY staff_on_job.id
-        <if test="staffOnJob.contractStartTime != null">
-            HAVING MIN(t1.contract_start_time) = #{staffOnJob.contractStartTime}
+        LEFT JOIN staff_contract as t1 ON t1.staff_on_job_id = staff_on_job.id
+        WHERE 1=1
+        <if test="staffOnJob.staffState != null">
+            AND staff_state = #{staffOnJob.staffState}
         </if>
-        order by staff_on_job.create_time desc
+        <if test="staffOnJob.staffName != null and staffOnJob.staffName != '' ">
+            AND staff_name LIKE CONCAT('%',#{staffOnJob.staffName},'%')
+        </if>
+        <if test="staffOnJob.entryDateStart != null and staffOnJob.entryDateStart != '' ">
+            AND contract_expire_time &gt;= DATE_FORMAT(#{staffOnJob.entryDateStart},'%Y-%m-%d')
+        </if>
+        <if test="staffOnJob.entryDateEnd != null and staffOnJob.entryDateEnd != '' ">
+            AND contract_expire_time &lt;= DATE_FORMAT(#{staffOnJob.entryDateEnd},'%Y-%m-%d')
+        </if>
+        GROUP BY staff_on_job.id
     </select>
     <select id="staffOnJobList" resultType="com.ruoyi.staff.dto.StaffOnJobDto">
         SELECT
@@ -91,15 +37,13 @@
         sys_post sp ON sp.post_id = staff_on_job.sys_post_id
         LEFT JOIN
         sys_dept sd ON sd.dept_id = staff_on_job.sys_dept_id
-        <where>
-            <if test="staffOnJob.staffState != null">
-                AND staff_state = #{staffOnJob.staffState}
-            </if>
-            <if test="staffOnJob.staffName != null and staffOnJob.staffName != '' ">
-                AND staff_name LIKE CONCAT('%',#{staffOnJob.staffName},'%')
-            </if>
-        </where>
-        order by staff_on_job.create_time desc
+        where 1=1
+        <if test="staffOnJob.staffState != null">
+            AND staff_state = #{staffOnJob.staffState}
+        </if>
+        <if test="staffOnJob.staffName != null and staffOnJob.staffName != '' ">
+            AND staff_name LIKE CONCAT('%',#{staffOnJob.staffName},'%')
+        </if>
     </select>
     <!-- 缁熻鎸囧畾鏃ユ湡鐨勫湪鑱屽憳宸ユ暟 -->
     <select id="countOnJobStaffByDate" resultType="java.lang.Integer">
diff --git a/src/main/resources/mapper/staff/StaffSalaryMainMapper.xml b/src/main/resources/mapper/staff/StaffSalaryMainMapper.xml
index bec4e6d..c3f0c62 100644
--- a/src/main/resources/mapper/staff/StaffSalaryMainMapper.xml
+++ b/src/main/resources/mapper/staff/StaffSalaryMainMapper.xml
@@ -16,11 +16,4 @@
         <result column="update_user" property="updateUser" />
     </resultMap>
 
-    <select id="selectIssuedDeptIds" resultType="java.lang.String">
-        SELECT DISTINCT dept_ids
-        FROM staff_salary_main
-        WHERE salary_month = #{salaryMonth}
-          AND status = 5
-    </select>
-
 </mapper>
diff --git a/src/main/resources/mapper/stock/StockInRecordMapper.xml b/src/main/resources/mapper/stock/StockInRecordMapper.xml
index 3e10e2b..55c589b 100644
--- a/src/main/resources/mapper/stock/StockInRecordMapper.xml
+++ b/src/main/resources/mapper/stock/StockInRecordMapper.xml
@@ -21,11 +21,11 @@
         pm.unit,
         u.nick_name as createBy,
         CASE
-            WHEN TRIM(sir.record_type) = '7' THEN
+            WHEN #{params.topParentProductId} = 3 AND TRIM(sir.record_type) = '7' THEN
                 COALESCE(pl_by_product.purchase_contract_number, pl_direct.purchase_contract_number)
-            WHEN TRIM(sir.record_type) = '10' THEN
+            WHEN #{params.topParentProductId} = 3 AND TRIM(sir.record_type) = '10' THEN
                 pl_by_quality.purchase_contract_number
-            WHEN #{params.topParentProductId} = 276 THEN
+            WHEN #{params.topParentProductId} = 1 THEN
                 CASE
                     WHEN TRIM(sir.record_type) IN ('14', '15') THEN
                         sl_return.sales_contract_no
@@ -132,7 +132,7 @@
                 and p.id in (select id from product_tree)
             </if>
         </where>
-        order by sir.id desc
+        order by sir.create_time desc
     </select>
     <select id="listStockInRecordExportData" resultType="com.ruoyi.stock.execl.StockInRecordExportData">
         SELECT
@@ -159,7 +159,7 @@
                 and sir.record_type = #{params.recordType}
             </if>
         </where>
-        order by sir.id desc
+        order by sir.create_time desc
     </select>
     <select id="listPageAccountPurchase" resultType="com.ruoyi.account.bean.vo.purchase.PurchaseInboundVo">
         SELECT
diff --git a/src/main/resources/mapper/stock/StockInventoryMapper.xml b/src/main/resources/mapper/stock/StockInventoryMapper.xml
index ac9c49b..7322898 100644
--- a/src/main/resources/mapper/stock/StockInventoryMapper.xml
+++ b/src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -113,7 +113,7 @@
         product_model_id,
         MAX(create_time) as create_time,
         MAX(update_time) as update_time,
-        MAX(warn_num) as warn_num,
+        SUM(warn_num) as warn_num,
         MAX(version) as version,
         model,
         MAX(remark) as remark,
@@ -222,7 +222,6 @@
         unit,
         product_name,
         product_id
-        order by combined.create_time desc
     </select>
 
     <select id="listStockInventoryExportData" resultType="com.ruoyi.stock.execl.StockInventoryExportData">
@@ -352,11 +351,7 @@
         su.nick_name as create_by
         from
         stock_in_record sir
-        left join (
-            select product_model_id, sum(qualitity) as qualitity
-            from stock_inventory
-            group by product_model_id
-        ) si on sir.product_model_id = si.product_model_id
+        left join stock_inventory si on sir.batch_no = si.batch_no
         left join product_model pm on sir.product_model_id = pm.id
         left join product p on pm.product_id = p.id
         left join sys_user su on sir.create_user = su.user_id
@@ -372,7 +367,7 @@
                 and sir.create_time &lt;= #{ew.endMonth}
             </if>
         </where>
-        order by sir.id desc
+        order by sir.create_time desc
     </select>
 
     <select id="stockInAndOutRecord" resultType="com.ruoyi.stock.dto.StockInventoryDto">
diff --git a/src/main/resources/mapper/stock/StockOutRecordMapper.xml b/src/main/resources/mapper/stock/StockOutRecordMapper.xml
index ad5976f..33e42ec 100644
--- a/src/main/resources/mapper/stock/StockOutRecordMapper.xml
+++ b/src/main/resources/mapper/stock/StockOutRecordMapper.xml
@@ -62,7 +62,7 @@
                 and p.id in (select id from product_tree)
             </if>
         </where>
-        order by sor.id desc
+        order by sor.create_time desc
     </select>
     <select id="listStockOutRecordExportData" resultType="com.ruoyi.stock.execl.StockOutRecordExportData">
         SELECT
diff --git a/src/main/resources/mapper/system/SysDeptMapper.xml b/src/main/resources/mapper/system/SysDeptMapper.xml
index de46729..ee5256f 100644
--- a/src/main/resources/mapper/system/SysDeptMapper.xml
+++ b/src/main/resources/mapper/system/SysDeptMapper.xml
@@ -22,9 +22,9 @@
 		<result property="updateTime" column="update_time" />
 		<result property="staffCount" column="staff_count" />
 	</resultMap>
-
+	
 	<sql id="selectDeptVo">
-        select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status, d.del_flag, d.create_by, d.create_time
+        select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status, d.del_flag, d.create_by, d.create_time 
         from sys_dept d
     </sql>
 
@@ -49,9 +49,9 @@
 		<!-- 鏁版嵁鑼冨洿杩囨护 -->
 		${params.dataScope}
 		group by d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status, d.del_flag, d.create_by, d.create_time
-		order by d.parent_id asc, d.order_num asc, d.create_time desc
+		order by d.parent_id, d.order_num
 	</select>
-
+    
     <select id="selectDeptListByRoleId" resultType="java.lang.Long">
 		select d.dept_id
 		from sys_dept d
@@ -60,40 +60,39 @@
             <if test="deptCheckStrictly">
               and d.dept_id not in (select d.parent_id from sys_dept d inner join sys_role_dept rd on d.dept_id = rd.dept_id and rd.role_id = #{roleId})
             </if>
-		order by d.parent_id asc, d.order_num asc, d.create_time desc
+		order by d.parent_id, d.order_num
 	</select>
-
+    
     <select id="selectDeptById" parameterType="Long" resultMap="SysDeptResult">
 		select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status,
 			(select dept_name from sys_dept where dept_id = d.parent_id) parent_name,
 			d.dept_nick
 		from sys_dept d
 		where d.dept_id = #{deptId}
-		order by d.create_time desc
 	</select>
-
+    
     <select id="checkDeptExistUser" parameterType="Long" resultType="int">
 		select count(1) from sys_user_dept where dept_id = #{deptId}
 	</select>
-
+	
 	<select id="hasChildByDeptId" parameterType="Long" resultType="int">
 		select count(1) from sys_dept
 		where del_flag = '0' and parent_id = #{deptId} limit 1
 	</select>
-
+	
 	<select id="selectChildrenDeptById" parameterType="Long" resultMap="SysDeptResult">
 		select * from sys_dept where find_in_set(#{deptId}, ancestors)
 	</select>
-
+	
 	<select id="selectNormalChildrenDeptById" parameterType="Long" resultType="int">
 		select count(*) from sys_dept where status = 0 and del_flag = '0' and find_in_set(#{deptId}, ancestors)
 	</select>
-
+	
 	<select id="checkDeptNameUnique" resultMap="SysDeptResult">
 	    <include refid="selectDeptVo"/>
-		where dept_name=#{deptName} and parent_id = #{parentId} and del_flag = '0' order by d.create_time desc limit 1
+		where dept_name=#{deptName} and parent_id = #{parentId} and del_flag = '0' limit 1
 	</select>
-
+    
     <insert id="insertDept" parameterType="com.ruoyi.project.system.domain.SysDept">
  		insert into sys_dept(
  			<if test="deptId != null and deptId != 0">dept_id,</if>
@@ -123,7 +122,7 @@
  			sysdate()
  		)
 	</insert>
-
+	
 	<update id="updateDept" parameterType="com.ruoyi.project.system.domain.SysDept">
  		update sys_dept
  		<set>
@@ -141,7 +140,7 @@
  		</set>
  		where dept_id = #{deptId}
 	</update>
-
+	
 	<update id="updateDeptChildren" parameterType="java.util.List">
 	    update sys_dept set ancestors =
 	    <foreach collection="depts" item="item" index="index"
@@ -154,14 +153,14 @@
 	        #{item.deptId}
 	    </foreach>
 	</update>
-
+	 
 	<update id="updateDeptStatusNormal" parameterType="Long">
- 	    update sys_dept set status = '0' where dept_id in
+ 	    update sys_dept set status = '0' where dept_id in 
  	    <foreach collection="array" item="deptId" open="(" separator="," close=")">
         	#{deptId}
         </foreach>
 	</update>
-
+	
 	<delete id="deleteDeptById" parameterType="Long">
 		update sys_dept set del_flag = '2' where dept_id = #{deptId}
 	</delete>
@@ -185,4 +184,4 @@
 		WHERE parent_id = 100;
 	</select>
 
-</mapper>
+</mapper> 
\ No newline at end of file
diff --git a/src/main/resources/mapper/system/SysDictTypeMapper.xml b/src/main/resources/mapper/system/SysDictTypeMapper.xml
index dd2342e..1cf1349 100644
--- a/src/main/resources/mapper/system/SysDictTypeMapper.xml
+++ b/src/main/resources/mapper/system/SysDictTypeMapper.xml
@@ -14,9 +14,9 @@
 		<result property="updateBy"   column="update_by"   />
 		<result property="updateTime" column="update_time" />
 	</resultMap>
-
+	
 	<sql id="selectDictTypeVo">
-        select dict_id, dict_name, dict_type, status, create_by, create_time, remark
+        select dict_id, dict_name, dict_type, status, create_by, create_time, remark 
 		from sys_dict_type
     </sql>
 
@@ -39,37 +39,36 @@
 				and date_format(create_time,'%Y%m%d') &lt;= date_format(#{params.endTime},'%Y%m%d')
 			</if>
 	    </where>
-        order by create_time desc
 	</select>
-
+	
 	<select id="selectDictTypeAll" resultMap="SysDictTypeResult">
 		<include refid="selectDictTypeVo"/>
 	</select>
-
+	
 	<select id="selectDictTypeById" parameterType="Long" resultMap="SysDictTypeResult">
 		<include refid="selectDictTypeVo"/>
 		where dict_id = #{dictId}
 	</select>
-
+	
 	<select id="selectDictTypeByType" parameterType="String" resultMap="SysDictTypeResult">
 		<include refid="selectDictTypeVo"/>
 		where dict_type = #{dictType}
 	</select>
-
+	
 	<select id="checkDictTypeUnique" parameterType="String" resultMap="SysDictTypeResult">
 		<include refid="selectDictTypeVo"/>
 		where dict_type = #{dictType} limit 1
 	</select>
-
+	
 	<delete id="deleteDictTypeById" parameterType="Long">
  		delete from sys_dict_type where dict_id = #{dictId}
  	</delete>
-
+ 	
  	<delete id="deleteDictTypeByIds" parameterType="Long">
  		delete from sys_dict_type where dict_id in
  		<foreach collection="array" item="dictId" open="(" separator="," close=")">
  			#{dictId}
-        </foreach>
+        </foreach> 
  	</delete>
 
  	<update id="updateDictType" parameterType="com.ruoyi.project.system.domain.SysDictType">
@@ -84,7 +83,7 @@
  		</set>
  		where dict_id = #{dictId}
 	</update>
-
+ 	
  	<insert id="insertDictType" parameterType="com.ruoyi.project.system.domain.SysDictType">
  		insert into sys_dict_type(
  			<if test="dictName != null and dictName != ''">dict_name,</if>
@@ -102,5 +101,5 @@
  			sysdate()
  		)
 	</insert>
-
-</mapper>
+	
+</mapper> 
\ No newline at end of file
diff --git a/src/main/resources/mapper/system/SysNoticeMapper.xml b/src/main/resources/mapper/system/SysNoticeMapper.xml
index 14372d8..3dd5735 100644
--- a/src/main/resources/mapper/system/SysNoticeMapper.xml
+++ b/src/main/resources/mapper/system/SysNoticeMapper.xml
@@ -10,16 +10,11 @@
         <result property="noticeType"     column="notice_type"     />
         <result property="noticeContent"  column="notice_content"  />
         <result property="status"         column="status"          />
-        <result property="senderId"       column="sender_id"       />
-        <result property="consigneeId"    column="consignee_id"    />
-        <result property="jumpPath"       column="jump_path"       />
-        <result property="appJumpPath"    column="app_jump_path"   />
         <result property="createBy"       column="create_by"       />
         <result property="createTime"     column="create_time"     />
         <result property="updateBy"       column="update_by"       />
         <result property="updateTime"     column="update_time"     />
         <result property="remark"         column="remark"          />
-        <result property="tenantId"       column="tenant_id"       />
     </resultMap>
 
     <sql id="selectNoticeVo">
diff --git a/src/main/resources/mapper/system/SysPostMapper.xml b/src/main/resources/mapper/system/SysPostMapper.xml
index d62d78b..177f74d 100644
--- a/src/main/resources/mapper/system/SysPostMapper.xml
+++ b/src/main/resources/mapper/system/SysPostMapper.xml
@@ -16,12 +16,12 @@
 		<result property="updateTime"    column="update_time"   />
 		<result property="remark"        column="remark"        />
 	</resultMap>
-
+	
 	<sql id="selectPostVo">
-        select post_id, post_code, post_name, post_sort, status, create_by, create_time, remark
+        select post_id, post_code, post_name, post_sort, status, create_by, create_time, remark 
 		from sys_post
     </sql>
-
+	
 	<select id="selectPostList" parameterType="com.ruoyi.project.system.domain.SysPost" resultMap="SysPostResult">
 	    <include refid="selectPostVo"/>
 		<where>
@@ -35,18 +35,17 @@
 				AND post_name like concat('%', #{postName}, '%')
 			</if>
 		</where>
-        order by create_time desc
 	</select>
-
+	
 	<select id="selectPostAll" resultMap="SysPostResult">
 		<include refid="selectPostVo"/>
 	</select>
-
+	
 	<select id="selectPostById" parameterType="Long" resultMap="SysPostResult">
 		<include refid="selectPostVo"/>
 		where post_id = #{postId}
 	</select>
-
+	
 	<select id="selectPostListByUserId" parameterType="Long" resultType="Long">
 		select p.post_id
         from sys_post p
@@ -54,7 +53,7 @@
 	        left join sys_user u on u.user_id = up.user_id
 	    where u.user_id = #{userId}
 	</select>
-
+	
 	<select id="selectPostsByUserName" parameterType="String" resultMap="SysPostResult">
 		select p.post_id, p.post_name, p.post_code
 		from sys_post p
@@ -62,17 +61,17 @@
 			 left join sys_user u on u.user_id = up.user_id
 		where u.user_name = #{userName}
 	</select>
-
+	
 	<select id="checkPostNameUnique" parameterType="String" resultMap="SysPostResult">
 		<include refid="selectPostVo"/>
 		 where post_name=#{postName} limit 1
 	</select>
-
+	
 	<select id="checkPostCodeUnique" parameterType="String" resultMap="SysPostResult">
 		<include refid="selectPostVo"/>
 		 where post_code=#{postCode} limit 1
 	</select>
-
+	
 	<update id="updatePost" parameterType="com.ruoyi.project.system.domain.SysPost">
  		update sys_post
  		<set>
@@ -86,7 +85,7 @@
  		</set>
  		where post_id = #{postId}
 	</update>
-
+ 	
  	<insert id="insertPost" parameterType="com.ruoyi.project.system.domain.SysPost" useGeneratedKeys="true" keyProperty="postId">
  		insert into sys_post(
  			<if test="postId != null and postId != 0">post_id,</if>
@@ -108,16 +107,16 @@
  			sysdate()
  		)
 	</insert>
-
+	
 	<delete id="deletePostById" parameterType="Long">
 		delete from sys_post where post_id = #{postId}
 	</delete>
-
+	
 	<delete id="deletePostByIds" parameterType="Long">
  		delete from sys_post where post_id in
  		<foreach collection="array" item="postId" open="(" separator="," close=")">
  			#{postId}
-        </foreach>
+        </foreach> 
  	</delete>
 
-</mapper>
+</mapper> 
\ No newline at end of file
diff --git a/src/main/resources/mapper/system/SysRoleMapper.xml b/src/main/resources/mapper/system/SysRoleMapper.xml
index 45617f3..9e16cf7 100644
--- a/src/main/resources/mapper/system/SysRoleMapper.xml
+++ b/src/main/resources/mapper/system/SysRoleMapper.xml
@@ -20,10 +20,10 @@
 		<result property="updateTime"         column="update_time"           />
 		<result property="remark"             column="remark"                />
 	</resultMap>
-
+	
 	<sql id="selectRoleVo">
 	    select distinct r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.menu_check_strictly, r.dept_check_strictly,
-            r.status, r.del_flag, r.create_time, r.remark
+            r.status, r.del_flag, r.create_time, r.remark 
         from sys_role r
 	        left join sys_user_role ur on ur.role_id = r.role_id
 	        left join sys_user u on u.user_id = ur.user_id
@@ -54,17 +54,17 @@
 		${params.dataScope}
 		order by r.role_sort
 	</select>
-
+    
 	<select id="selectRolePermissionByUserId" parameterType="Long" resultMap="SysRoleResult">
 		<include refid="selectRoleVo"/>
 		WHERE r.del_flag = '0' and ur.user_id = #{userId}
 	</select>
-
+	
 	<select id="selectRoleAll" resultMap="SysRoleResult">
 		<include refid="selectRoleVo"/>
 		WHERE r.del_flag = '0'
 	</select>
-
+	
 	<select id="selectRoleListByUserId" parameterType="Long" resultType="Long">
 		select r.role_id
         from sys_role r
@@ -72,27 +72,27 @@
 	        left join sys_user u on u.user_id = ur.user_id
 	    where u.user_id = #{userId}
 	</select>
-
+	
 	<select id="selectRoleById" parameterType="Long" resultMap="SysRoleResult">
 		<include refid="selectRoleVo"/>
 		where r.role_id = #{roleId}
 	</select>
-
+	
 	<select id="selectRolesByUserName" parameterType="String" resultMap="SysRoleResult">
 		<include refid="selectRoleVo"/>
 		WHERE r.del_flag = '0' and u.user_name = #{userName}
 	</select>
-
+	
 	<select id="checkRoleNameUnique" parameterType="String" resultMap="SysRoleResult">
 		<include refid="selectRoleVo"/>
 		 where r.role_name=#{roleName} and r.del_flag = '0' limit 1
 	</select>
-
+	
 	<select id="checkRoleKeyUnique" parameterType="String" resultMap="SysRoleResult">
 		<include refid="selectRoleVo"/>
 		 where r.role_key=#{roleKey} and r.del_flag = '0' limit 1
 	</select>
-
+	
  	<insert id="insertRole" parameterType="com.ruoyi.project.system.domain.SysRole" useGeneratedKeys="true" keyProperty="roleId">
  		insert into sys_role(
  			<if test="roleId != null and roleId != 0">role_id,</if>
@@ -120,7 +120,7 @@
  			sysdate()
  		)
 	</insert>
-
+	
 	<update id="updateRole" parameterType="com.ruoyi.project.system.domain.SysRole">
  		update sys_role
  		<set>
@@ -137,16 +137,16 @@
  		</set>
  		where role_id = #{roleId}
 	</update>
-
+	
 	<delete id="deleteRoleById" parameterType="Long">
  		update sys_role set del_flag = '2' where role_id = #{roleId}
  	</delete>
-
+ 	
  	<delete id="deleteRoleByIds" parameterType="Long">
  	    update sys_role set del_flag = '2' where role_id in
  		<foreach collection="array" item="roleId" open="(" separator="," close=")">
  			#{roleId}
-        </foreach>
+        </foreach> 
  	</delete>
-
-</mapper>
+ 	
+</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 b12ee0f..69a5522 100644
--- a/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/src/main/resources/mapper/system/SysUserMapper.xml
@@ -1,165 +1,193 @@
 <?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">
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.project.system.mapper.SysUserMapper">
 
     <resultMap type="com.ruoyi.project.system.domain.SysUser" id="SysUserResult">
-        <id     property="userId"       column="user_id"      />
-        <result property="userName"     column="user_name"    />
-        <result property="nickName"     column="nick_name"    />
-        <result property="email"        column="email"        />
-        <result property="phonenumber"  column="phonenumber"  />
-        <result property="sex"          column="sex"          />
-        <result property="avatar"       column="avatar"       />
-        <result property="password"     column="password"     />
-        <result property="status"       column="status"       />
-        <result property="delFlag"      column="del_flag"     />
-        <result property="aiEnabled"    column="ai_enabled"   />
-        <result property="loginIp"      column="login_ip"     />
-        <result property="loginDate"    column="login_date"   />
-        <result property="createBy"     column="create_by"    />
-        <result property="createTime"   column="create_time"  />
-        <result property="updateBy"     column="update_by"    />
-        <result property="updateTime"   column="update_time"  />
-        <result property="remark"       column="remark"       />
-		<result property="deptNames"       column="dept_names"       />
-		<result property="tenantId"       column="tenant_id"       />
-		<result property="roleNames"       column="role_names"       />
-        <association property="dept"    javaType="com.ruoyi.project.system.domain.SysDept"         resultMap="deptResult" />
-        <collection  property="roles"   javaType="java.util.List"  resultMap="RoleResult" />
+        <id property="userId" column="user_id"/>
+        <result property="userName" column="user_name"/>
+        <result property="nickName" column="nick_name"/>
+        <result property="email" column="email"/>
+        <result property="phonenumber" column="phonenumber"/>
+        <result property="sex" column="sex"/>
+        <result property="avatar" column="avatar"/>
+        <result property="password" column="password"/>
+        <result property="status" column="status"/>
+        <result property="delFlag" column="del_flag"/>
+        <result property="aiEnabled" column="ai_enabled"/>
+        <result property="loginIp" column="login_ip"/>
+        <result property="loginDate" column="login_date"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="remark" column="remark"/>
+        <result property="deptNames" column="dept_names"/>
+        <result property="tenantId" column="tenant_id"/>
+        <association property="dept" javaType="com.ruoyi.project.system.domain.SysDept" resultMap="deptResult"/>
+        <collection property="roles" javaType="java.util.List" resultMap="RoleResult"/>
     </resultMap>
 
     <resultMap id="deptResult" type="com.ruoyi.project.system.domain.SysDept">
-        <id     property="deptId"    column="dept_id"     />
-        <result property="parentId"  column="parent_id"   />
-        <result property="deptName"  column="dept_name"   />
-        <result property="ancestors" column="ancestors"   />
-        <result property="orderNum"  column="order_num"   />
-        <result property="leader"    column="leader"      />
-        <result property="status"    column="dept_status" />
+        <id property="deptId" column="dept_id"/>
+        <result property="parentId" column="parent_id"/>
+        <result property="deptName" column="dept_name"/>
+        <result property="ancestors" column="ancestors"/>
+        <result property="orderNum" column="order_num"/>
+        <result property="leader" column="leader"/>
+        <result property="status" column="dept_status"/>
     </resultMap>
 
     <resultMap id="RoleResult" type="com.ruoyi.project.system.domain.SysRole">
-        <id     property="roleId"       column="role_id"        />
-        <result property="roleName"     column="role_name"      />
-        <result property="roleKey"      column="role_key"       />
-        <result property="roleSort"     column="role_sort"      />
-        <result property="dataScope"    column="data_scope"     />
-        <result property="status"       column="role_status"    />
+        <id property="roleId" column="role_id"/>
+        <result property="roleName" column="role_name"/>
+        <result property="roleKey" column="role_key"/>
+        <result property="roleSort" column="role_sort"/>
+        <result property="dataScope" column="data_scope"/>
+        <result property="status" column="role_status"/>
     </resultMap>
 
-	<sql id="selectUserVo">
-        select u.user_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.ai_enabled, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
-        r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status,u.tenant_id
+    <sql id="selectUserVo">
+        select u.user_id,
+               u.user_name,
+               u.nick_name,
+               u.email,
+               u.avatar,
+               u.phonenumber,
+               u.password,
+               u.sex,
+               u.status,
+               u.del_flag,
+               u.ai_enabled,
+               u.login_ip,
+               u.login_date,
+               u.create_by,
+               u.create_time,
+               u.remark,
+               r.role_id,
+               r.role_name,
+               r.role_key,
+               r.role_sort,
+               r.data_scope,
+               r.status as role_status,
+               u.tenant_id
         from sys_user u
-		    left join sys_user_role ur on u.user_id = ur.user_id
-		    left join sys_role r on r.role_id = ur.role_id
+                 left join sys_user_role ur on u.user_id = ur.user_id
+                 left join sys_role r on r.role_id = ur.role_id
     </sql>
 
     <select id="selectUserList" parameterType="com.ruoyi.project.system.domain.SysUser" resultMap="SysUserResult">
-		select u.user_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,T2.dept_names from sys_user u
-		left join
-		(	SELECT T1.user_id,GROUP_CONCAT(T2.dept_name SEPARATOR ', ') AS dept_names
-			FROM
-				sys_user_dept T1
-			LEFT JOIN sys_dept T2 ON T1.dept_id = T2.dept_id
-		<where>
-			<if test="tenantId != null and tenantId != 0">
-				T1.dept_id = #{tenantId}
-			</if>
-		</where>
-			GROUP BY T1.user_id
-		) T2 on T2.user_id = u.user_id
-		where u.del_flag = '0'
-		<if test="userId != null and userId != 0">
-			AND u.user_id = #{userId}
-		</if>
-		<if test="userName != null and userName != ''">
-			AND u.user_name like concat('%', #{userName}, '%')
-		</if>
-		<if test="status != null and status != ''">
-			AND u.status = #{status}
-		</if>
-		<if test="phonenumber != null and phonenumber != ''">
-			AND u.phonenumber like concat('%', #{phonenumber}, '%')
-		</if>
-		<if test="params.beginTime != null and params.beginTime != ''"><!-- 寮�濮嬫椂闂存绱� -->
-			AND date_format(u.create_time,'%Y%m%d') &gt;= date_format(#{params.beginTime},'%Y%m%d')
-		</if>
-		<if test="params.endTime != null and params.endTime != ''"><!-- 缁撴潫鏃堕棿妫�绱� -->
-			AND date_format(u.create_time,'%Y%m%d') &lt;= date_format(#{params.endTime},'%Y%m%d')
-		</if>
-		<if test="deptId != null">
-			AND u.user_id IN
-			(
-			SELECT user_id FROM sys_user_dept WHERE dept_id = #{deptId}
-			)
-		</if>
-		<!-- 鏁版嵁鑼冨洿杩囨护 -->
-		${params.dataScope}
-		ORDER BY u.create_time DESC
-	</select>
+        select u.user_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag,
+        u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,T2.dept_names from sys_user u
+        left join
+        ( SELECT T1.user_id,GROUP_CONCAT(T2.dept_name SEPARATOR ', ') AS dept_names
+        FROM
+        sys_user_dept T1
+        LEFT JOIN sys_dept T2 ON T1.dept_id = T2.dept_id
+        <where>
+            <if test="tenantId != null and tenantId != 0">
+                T1.dept_id = #{tenantId}
+            </if>
+        </where>
+        GROUP BY T1.user_id
+        ) T2 on T2.user_id = u.user_id
+        where u.del_flag = '0'
+        <if test="userId != null and userId != 0">
+            AND u.user_id = #{userId}
+        </if>
+        <if test="userName != null and userName != ''">
+            AND u.user_name like concat('%', #{userName}, '%')
+        </if>
+        <if test="status != null and status != ''">
+            AND u.status = #{status}
+        </if>
+        <if test="phonenumber != null and phonenumber != ''">
+            AND u.phonenumber like concat('%', #{phonenumber}, '%')
+        </if>
+        <if test="params.beginTime != null and params.beginTime != ''"><!-- 寮�濮嬫椂闂存绱� -->
+            AND date_format(u.create_time,'%Y%m%d') &gt;= date_format(#{params.beginTime},'%Y%m%d')
+        </if>
+        <if test="params.endTime != null and params.endTime != ''"><!-- 缁撴潫鏃堕棿妫�绱� -->
+            AND date_format(u.create_time,'%Y%m%d') &lt;= date_format(#{params.endTime},'%Y%m%d')
+        </if>
+        <if test="deptId != null">
+            AND u.user_id IN
+            (
+            SELECT user_id FROM sys_user_dept WHERE dept_id = #{deptId}
+            )
+        </if>
+        <!-- 鏁版嵁鑼冨洿杩囨护 -->
+        ${params.dataScope}
+    </select>
 
-	<select id="selectAllocatedList" parameterType="com.ruoyi.project.system.domain.SysUser" resultMap="SysUserResult">
-	    select distinct u.user_id,  u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time
-	    from sys_user u
-			 left join sys_user_role ur on u.user_id = ur.user_id
-			 left join sys_role r on r.role_id = ur.role_id
-	    where u.del_flag = '0' and r.role_id = #{roleId}
-	    <if test="userName != null and userName != ''">
-			AND u.user_name like concat('%', #{userName}, '%')
-		</if>
-		<if test="phonenumber != null and phonenumber != ''">
-			AND u.phonenumber like concat('%', #{phonenumber}, '%')
-		</if>
-		<!-- 鏁版嵁鑼冨洿杩囨护 -->
-		${params.dataScope}
-	</select>
+    <select id="selectAllocatedList" parameterType="com.ruoyi.project.system.domain.SysUser" resultMap="SysUserResult">
+        select distinct u.user_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time
+        from sys_user u
+        left join sys_user_role ur on u.user_id = ur.user_id
+        left join sys_role r on r.role_id = ur.role_id
+        where u.del_flag = '0' and r.role_id = #{roleId}
+        <if test="userName != null and userName != ''">
+            AND u.user_name like concat('%', #{userName}, '%')
+        </if>
+        <if test="phonenumber != null and phonenumber != ''">
+            AND u.phonenumber like concat('%', #{phonenumber}, '%')
+        </if>
+        <!-- 鏁版嵁鑼冨洿杩囨护 -->
+        ${params.dataScope}
+    </select>
 
-	<select id="selectUnallocatedList" parameterType="com.ruoyi.project.system.domain.SysUser" resultMap="SysUserResult">
-	    select distinct u.user_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time
-	    from sys_user u
-			 left join sys_user_role ur on u.user_id = ur.user_id
-			 left join sys_role r on r.role_id = ur.role_id
-	    where u.del_flag = '0' and (r.role_id != #{roleId} or r.role_id IS NULL)
-	    and u.user_id not in (select u.user_id from sys_user u inner join sys_user_role ur on u.user_id = ur.user_id and ur.role_id = #{roleId})
-	    <if test="userName != null and userName != ''">
-			AND u.user_name like concat('%', #{userName}, '%')
-		</if>
-		<if test="phonenumber != null and phonenumber != ''">
-			AND u.phonenumber like concat('%', #{phonenumber}, '%')
-		</if>
-		<!-- 鏁版嵁鑼冨洿杩囨护 -->
-		${params.dataScope}
-		ORDER BY u.create_time DESC
-	</select>
+    <select id="selectUnallocatedList" parameterType="com.ruoyi.project.system.domain.SysUser"
+            resultMap="SysUserResult">
+        select distinct u.user_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time
+        from sys_user u
+        left join sys_user_role ur on u.user_id = ur.user_id
+        left join sys_role r on r.role_id = ur.role_id
+        where u.del_flag = '0' and (r.role_id != #{roleId} or r.role_id IS NULL)
+        and u.user_id not in (select u.user_id from sys_user u inner join sys_user_role ur on u.user_id = ur.user_id and
+        ur.role_id = #{roleId})
+        <if test="userName != null and userName != ''">
+            AND u.user_name like concat('%', #{userName}, '%')
+        </if>
+        <if test="phonenumber != null and phonenumber != ''">
+            AND u.phonenumber like concat('%', #{phonenumber}, '%')
+        </if>
+        <!-- 鏁版嵁鑼冨洿杩囨护 -->
+        ${params.dataScope}
+    </select>
 
-	<select id="selectUserByUserName" parameterType="String" resultMap="SysUserResult">
-	    <include refid="selectUserVo"/>
-		where u.user_name = #{userName} and u.del_flag = '0'
-		ORDER BY u.create_time DESC
-	</select>
+    <select id="selectUserByUserName" parameterType="String" resultMap="SysUserResult">
+        <include refid="selectUserVo"/>
+        where u.user_name = #{userName} and u.del_flag = '0'
+    </select>
 
-	<select id="selectUserById" parameterType="Long" resultMap="SysUserResult">
-		<include refid="selectUserVo"/>
-		where u.user_id = #{userId}
-		and u.del_flag = '0'
-		ORDER BY u.create_time DESC
-	</select>
+    <select id="selectUserById" parameterType="Long" resultMap="SysUserResult">
+        <include refid="selectUserVo"/>
+        where u.user_id = #{userId}
+        and u.del_flag = '0'
+    </select>
 
-	<select id="checkUserNameUnique" parameterType="String" resultMap="SysUserResult">
-		select user_id, user_name from sys_user where user_name = #{userName} and del_flag = '0' limit 1
-	</select>
+    <select id="checkUserNameUnique" parameterType="String" resultMap="SysUserResult">
+        select user_id, user_name
+        from sys_user
+        where user_name = #{userName}
+          and del_flag = '0' limit 1
+    </select>
 
-	<select id="checkPhoneUnique" parameterType="String" resultMap="SysUserResult">
-		select user_id, phonenumber from sys_user where phonenumber = #{phonenumber} and del_flag = '0' limit 1
-	</select>
+    <select id="checkPhoneUnique" parameterType="String" resultMap="SysUserResult">
+        select user_id, phonenumber
+        from sys_user
+        where phonenumber = #{phonenumber}
+          and del_flag = '0' limit 1
+    </select>
 
-	<select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult">
-		select user_id, email from sys_user where email = #{email} and del_flag = '0' limit 1
-	</select>
-    <select id="selectUserByIds" resultType="com.ruoyi.project.system.domain.SysUser">
+    <select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult">
+        select user_id, email
+        from sys_user
+        where email = #{email}
+          and del_flag = '0' limit 1
+    </select>
+    <select id="selectUserByIds" resultMap="SysUserResult">
         <include refid="selectUserVo"/>
         <where>
             <if test="userIds != null and userIds.size > 0">
@@ -170,173 +198,155 @@
             </if>
             and u.del_flag = '0'
         </where>
-        ORDER BY u.create_time DESC
     </select>
-	<select id="selectRegistrantIds" 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>
-		ORDER BY sys_user.create_time DESC
-	</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>
-		and del_flag = '0'
-		ORDER BY sys_user.create_time DESC
-	</select>
-	<select id="selectUserByNickName" resultType="com.ruoyi.project.system.domain.SysUser"
-			parameterType="java.lang.String">
-		<include refid="selectUserVo"/>
-		where u.nick_name = #{nickName} and u.del_flag = '0'
-		limit 1
-	</select>
-
-	<insert id="insertUser" parameterType="com.ruoyi.project.system.domain.SysUser" useGeneratedKeys="true" keyProperty="userId">
- 		insert into sys_user(
- 			<if test="userId != null and userId != 0">user_id,</if>
- 			<if test="userName != null and userName != ''">user_name,</if>
- 			<if test="nickName != null and nickName != ''">nick_name,</if>
- 			<if test="email != null and email != ''">email,</if>
- 			<if test="avatar != null and avatar != ''">avatar,</if>
- 			<if test="phonenumber != null and phonenumber != ''">phonenumber,</if>
- 			<if test="sex != null and sex != ''">sex,</if>
- 			<if test="password != null and password != ''">password,</if>
- 			<if test="status != null and status != ''">status,</if>
- 			<if test="createBy != null and createBy != ''">create_by,</if>
- 			<if test="remark != null and remark != ''">remark,</if>
-		    <if test="tenantId != null ">tenant_id,</if>
- 			create_time
- 		)values(
- 			<if test="userId != null and userId != ''">#{userId},</if>
- 			<if test="userName != null and userName != ''">#{userName},</if>
- 			<if test="nickName != null and nickName != ''">#{nickName},</if>
- 			<if test="email != null and email != ''">#{email},</if>
- 			<if test="avatar != null and avatar != ''">#{avatar},</if>
- 			<if test="phonenumber != null and phonenumber != ''">#{phonenumber},</if>
- 			<if test="sex != null and sex != ''">#{sex},</if>
- 			<if test="password != null and password != ''">#{password},</if>
- 			<if test="status != null and status != ''">#{status},</if>
- 			<if test="createBy != null and createBy != ''">#{createBy},</if>
- 			<if test="remark != null and remark != ''">#{remark},</if>
-		    <if test="tenantId != null ">#{tenantId},</if>
- 			sysdate()
- 		)
-	</insert>
-
-	<update id="updateUser" parameterType="com.ruoyi.project.system.domain.SysUser">
- 		update sys_user
- 		<set>
- 			<if test="nickName != null and nickName != ''">nick_name = #{nickName},</if>
- 			<if test="email != null ">email = #{email},</if>
- 			<if test="phonenumber != null ">phonenumber = #{phonenumber},</if>
- 			<if test="sex != null and sex != ''">sex = #{sex},</if>
- 			<if test="avatar != null and avatar != ''">avatar = #{avatar},</if>
- 			<if test="password != null and password != ''">password = #{password},</if>
- 			<if test="status != null and status != ''">status = #{status},</if>
- 			<if test="loginIp != null and loginIp != ''">login_ip = #{loginIp},</if>
- 			<if test="loginDate != null">login_date = #{loginDate},</if>
- 			<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
- 			<if test="remark != null">remark = #{remark},</if>
-			<if test="tenantId != null">tenant_id = #{tenantId},</if>
- 			update_time = sysdate()
- 		</set>
- 		where user_id = #{userId}
-	</update>
-
-	<update id="updateUserStatus" parameterType="com.ruoyi.project.system.domain.SysUser">
- 		update sys_user set status = #{status} where user_id = #{userId}
-	</update>
-
-	<update id="updateUserAvatar" parameterType="com.ruoyi.project.system.domain.SysUser">
- 		update sys_user set avatar = #{avatar} where user_name = #{userName}
-	</update>
-
-	<update id="resetUserPwd" parameterType="com.ruoyi.project.system.domain.SysUser">
- 		update sys_user set password = #{password} where user_name = #{userName}
-	</update>
-
-	<delete id="deleteUserById" parameterType="Long">
- 		update sys_user set del_flag = '2' where user_id = #{userId}
- 	</delete>
-
- 	<delete id="deleteUserByIds" parameterType="Long">
- 		update sys_user set del_flag = '2' where user_id in
- 		<foreach collection="array" item="userId" open="(" separator="," close=")">
- 			#{userId}
+    <select id="selectRegistrantIds" 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>
- 	</delete>
+        and del_flag = '0'
+    </select>
+    <select id="selectUserByNickName" resultType="com.ruoyi.project.system.domain.SysUser"
+            parameterType="java.lang.String">
+        <include refid="selectUserVo"/>
+        where u.nick_name = #{nickName} and u.del_flag = '0'
+        limit 1
+    </select>
 
-	<select id="getUserByRole" resultType="java.lang.Long">
-		select distinct su.user_id
-		from sys_user su
-				 left join sys_user_role sur on su.user_id = sur.user_id
-				 left join sys_role sr on sur.role_id = sr.role_id
-		where role_name like concat('%', #{role}, '%')
-		  and sr.del_flag = '0'
-		  and sr.status = '0'
-		  and su.status = '0'
-		  and su.del_flag = '0'
-		ORDER BY su.create_time DESC
-	</select>
+    <insert id="insertUser" parameterType="com.ruoyi.project.system.domain.SysUser" useGeneratedKeys="true"
+            keyProperty="userId">
+        insert into sys_user(
+        <if test="userId != null and userId != 0">user_id,</if>
+        <if test="userName != null and userName != ''">user_name,</if>
+        <if test="nickName != null and nickName != ''">nick_name,</if>
+        <if test="email != null and email != ''">email,</if>
+        <if test="avatar != null and avatar != ''">avatar,</if>
+        <if test="phonenumber != null and phonenumber != ''">phonenumber,</if>
+        <if test="sex != null and sex != ''">sex,</if>
+        <if test="password != null and password != ''">password,</if>
+        <if test="status != null and status != ''">status,</if>
+        <if test="createBy != null and createBy != ''">create_by,</if>
+        <if test="remark != null and remark != ''">remark,</if>
+        <if test="tenantId != null ">tenant_id,</if>
+        create_time
+        )values(
+        <if test="userId != null and userId != ''">#{userId},</if>
+        <if test="userName != null and userName != ''">#{userName},</if>
+        <if test="nickName != null and nickName != ''">#{nickName},</if>
+        <if test="email != null and email != ''">#{email},</if>
+        <if test="avatar != null and avatar != ''">#{avatar},</if>
+        <if test="phonenumber != null and phonenumber != ''">#{phonenumber},</if>
+        <if test="sex != null and sex != ''">#{sex},</if>
+        <if test="password != null and password != ''">#{password},</if>
+        <if test="status != null and status != ''">#{status},</if>
+        <if test="createBy != null and createBy != ''">#{createBy},</if>
+        <if test="remark != null and remark != ''">#{remark},</if>
+        <if test="tenantId != null ">#{tenantId},</if>
+        sysdate()
+        )
+    </insert>
 
-	<select id="selectUserListWithDetail" resultMap="SysUserResult">
-		select u.user_id, u.nick_name, u.user_name, u.status, u.del_flag,
-		       dept_agg.dept_names,
-		       role_agg.role_names
-		from sys_user u
-		left join (
-		    SELECT ud.user_id, GROUP_CONCAT(d.dept_name SEPARATOR ', ') AS dept_names
-		    FROM sys_user_dept ud
-		    LEFT JOIN sys_dept d ON ud.dept_id = d.dept_id
-		    WHERE d.del_flag = '0' AND d.status = '0'
-		    GROUP BY ud.user_id
-		) dept_agg on dept_agg.user_id = u.user_id
-		left join (
-		    SELECT ur.user_id, GROUP_CONCAT(r.role_name SEPARATOR ', ') AS role_names
-		    FROM sys_user_role ur
-		    LEFT JOIN sys_role r ON ur.role_id = r.role_id
-		    WHERE r.del_flag = '0' AND r.status = '0'
-		    GROUP BY ur.user_id
-		) role_agg on role_agg.user_id = u.user_id
-		where u.del_flag = '0' AND u.status = '0'
-	</select>
+    <update id="updateUser" parameterType="com.ruoyi.project.system.domain.SysUser">
+        update sys_user
+        <set>
+            <if test="nickName != null and nickName != ''">nick_name = #{nickName},</if>
+            <if test="email != null ">email = #{email},</if>
+            <if test="phonenumber != null ">phonenumber = #{phonenumber},</if>
+            <if test="sex != null and sex != ''">sex = #{sex},</if>
+            <if test="avatar != null and avatar != ''">avatar = #{avatar},</if>
+            <if test="password != null and password != ''">password = #{password},</if>
+            <if test="status != null and status != ''">status = #{status},</if>
+            <if test="loginIp != null and loginIp != ''">login_ip = #{loginIp},</if>
+            <if test="loginDate != null">login_date = #{loginDate},</if>
+            <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="tenantId != null">tenant_id = #{tenantId},</if>
+            update_time = sysdate()
+        </set>
+        where user_id = #{userId}
+    </update>
 
-	<select id="getUserByPerms" resultType="java.lang.Long">
-		select distinct t5.user_id
-		from sys_role_menu t1
-		left join sys_menu t2 on t1.menu_id = t2.menu_id
-		left join sys_role t3 on t1.role_id = t3.role_id
-		inner join sys_user_role t4 on t4.role_id = t3.role_id
-		inner join sys_user t5 on t5.user_id = t4.user_id
-		where t3.del_flag = '0'
-		and t2.perms is not null
-		and t2.perms &lt;&gt; ''
-		and t5.del_flag = '0'
-		and t5.status = '0'
-		and t3.status = '0'
-		<if test="perms != null and perms.size() > 0">
-			AND (
-			<foreach collection="perms" item="p" separator=" OR ">
-				t2.perms = #{p}
-				OR t2.perms = (split_part(#{p}, ':', 1) || ':' || split_part(#{p}, ':', 2) || ':*')
-				OR t2.perms = (split_part(#{p}, ':', 1) || ':*:*')
-			</foreach>
-			OR t2.perms = '*:*:*'
-			)
-		</if>
-	</select>
+    <update id="updateUserStatus" parameterType="com.ruoyi.project.system.domain.SysUser">
+        update sys_user
+        set status = #{status}
+        where user_id = #{userId}
+    </update>
+
+    <update id="updateUserAvatar" parameterType="com.ruoyi.project.system.domain.SysUser">
+        update sys_user
+        set avatar = #{avatar}
+        where user_name = #{userName}
+    </update>
+
+    <update id="resetUserPwd" parameterType="com.ruoyi.project.system.domain.SysUser">
+        update sys_user
+        set password = #{password}
+        where user_name = #{userName}
+    </update>
+
+    <delete id="deleteUserById" parameterType="Long">
+        update sys_user
+        set del_flag = '2'
+        where user_id = #{userId}
+    </delete>
+
+    <delete id="deleteUserByIds" parameterType="Long">
+        update sys_user set del_flag = '2' where user_id in
+        <foreach collection="array" item="userId" open="(" separator="," close=")">
+            #{userId}
+        </foreach>
+    </delete>
+
+    <select id="getUserByRole" resultType="java.lang.Long">
+        select distinct su.user_id
+        from sys_user su
+                 left join sys_user_role sur on su.user_id = sur.user_id
+                 left join sys_role sr on sur.role_id = sr.role_id
+        where role_name like concat('%', #{role}, '%')
+          and sr.del_flag = '0'
+          and sr.status = '0'
+          and su.status = '0'
+          and su.del_flag = '0'
+    </select>
+    <select id="getUserByPerms" resultType="java.lang.Long">
+        select distinct t5.user_id
+        from sys_role_menu t1
+        left join sys_menu t2 on t1.menu_id = t2.menu_id
+        left join sys_role t3 on t1.role_id = t3.role_id
+        inner join sys_user_role t4 on t4.role_id = t3.role_id
+        inner join sys_user t5 on t5.user_id = t4.user_id
+        where t3.del_flag = '0'
+        and t2.perms is not null
+        and t2.perms &lt;&gt; ''
+        and t5.del_flag = '0'
+        and t5.status = '0'
+        and t3.status = '0'
+        <if test="perms != null and perms.size() > 0">
+            AND (
+            <foreach collection="perms" item="p" separator=" OR ">
+                t2.perms = #{p}
+                OR t2.perms = (split_part(#{p}, ':', 1) || ':' || split_part(#{p}, ':', 2) || ':*')
+                OR t2.perms = (split_part(#{p}, ':', 1) || ':*:*')
+            </foreach>
+            OR t2.perms = '*:*:*'
+            )
+        </if>
+    </select>
 
 </mapper>
diff --git a/src/main/resources/mapper/technology/TechnologyOperationMapper.xml b/src/main/resources/mapper/technology/TechnologyOperationMapper.xml
index b09fdc2..f6adc74 100644
--- a/src/main/resources/mapper/technology/TechnologyOperationMapper.xml
+++ b/src/main/resources/mapper/technology/TechnologyOperationMapper.xml
@@ -32,6 +32,6 @@
                 and t.type = #{c.type}
             </if>
         </where>
-        order by t.id desc
+        order by t.id asc
     </select>
 </mapper>
diff --git a/src/main/resources/mapper/technology/TechnologyOperationParamMapper.xml b/src/main/resources/mapper/technology/TechnologyOperationParamMapper.xml
index 063f5aa..e1ccb2a 100644
--- a/src/main/resources/mapper/technology/TechnologyOperationParamMapper.xml
+++ b/src/main/resources/mapper/technology/TechnologyOperationParamMapper.xml
@@ -28,6 +28,6 @@
                 and top1.technology_param_id = #{paramId}
             </if>
         </where>
-        order by top1.id desc
+        order by top1.id asc
     </select>
 </mapper>
diff --git a/src/main/resources/mapper/warehouse/DocumentationBorrowManagementMapper.xml b/src/main/resources/mapper/warehouse/DocumentationBorrowManagementMapper.xml
index 2c58276..18b2082 100644
--- a/src/main/resources/mapper/warehouse/DocumentationBorrowManagementMapper.xml
+++ b/src/main/resources/mapper/warehouse/DocumentationBorrowManagementMapper.xml
@@ -51,7 +51,6 @@
         <if test="documentationBorrowManagement.entryDateEnd != null and documentationBorrowManagement.entryDateEnd != ''">
             and borrow_date &lt;= DATE_FORMAT(#{documentationBorrowManagement.entryDateEnd},'%Y-%m-%d')
         </if>
-        order by dbm.create_time desc
     </select>
     <select id="export" resultType="com.ruoyi.warehouse.dto.DocumentationBorrowManagementDto">
         select dbm.*,doc.doc_name
diff --git a/src/main/resources/mapper/warehouse/DocumentationMapper.xml b/src/main/resources/mapper/warehouse/DocumentationMapper.xml
index 503f175..91f17a9 100644
--- a/src/main/resources/mapper/warehouse/DocumentationMapper.xml
+++ b/src/main/resources/mapper/warehouse/DocumentationMapper.xml
@@ -32,7 +32,6 @@
         <if test="documentation.id != null">
             and doc.id = #{documentation.id}
         </if>
-        order by doc.create_time desc
     </select>
     <select id="listByDocumentClassificationId" resultType="com.ruoyi.warehouse.dto.DocumentationDto">
         SELECT
diff --git a/src/main/resources/mapper/warehouse/DocumentationReturnManagementMapper.xml b/src/main/resources/mapper/warehouse/DocumentationReturnManagementMapper.xml
index 7545c55..06202f8 100644
--- a/src/main/resources/mapper/warehouse/DocumentationReturnManagementMapper.xml
+++ b/src/main/resources/mapper/warehouse/DocumentationReturnManagementMapper.xml
@@ -28,7 +28,6 @@
         <if test="documentationReturnManagement.entryDateEnd != null and documentationReturnManagement.entryDateEnd != ''">
             and return_date &lt;= DATE_FORMAT(#{documentationReturnManagement.entryDateEnd},'%Y-%m-%d')
         </if>
-        order by dbm.create_time desc
     </select>
 
     <select id="exportrevent" resultType="com.ruoyi.warehouse.dto.ReturnExportDto">
diff --git a/src/main/resources/mapper/warehouse/WarehouseGoodsShelvesRowcolMapper.xml b/src/main/resources/mapper/warehouse/WarehouseGoodsShelvesRowcolMapper.xml
index 2b083a4..87dfa32 100644
--- a/src/main/resources/mapper/warehouse/WarehouseGoodsShelvesRowcolMapper.xml
+++ b/src/main/resources/mapper/warehouse/WarehouseGoodsShelvesRowcolMapper.xml
@@ -36,7 +36,6 @@
                 and wgsr.id = #{warehouseGoodsShelvesRowcol.id}
             </if>
         </where>
-        order by wgsr.create_time desc
     </select>
 
 </mapper>

--
Gitblit v1.9.3