From 0d7d874912d0147376826b55667a1deb6547ed91 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 21 五月 2026 15:25:27 +0800
Subject: [PATCH] Merge branch 'dev_New_pro' into dev_宁夏_英泽防锈

---
 src/main/java/com/ruoyi/ai/assistant/ApproveTodoIntentExecutor.java                                         |  199 
 src/main/java/com/ruoyi/sales/controller/SalespersonManagementController.java                               |   20 
 src/main/java/com/ruoyi/project/system/controller/SysMenuController.java                                    |  276 
 src/main/java/com/ruoyi/account/controller/financial/AccountSubjectController.java                          |    8 
 src/main/java/com/ruoyi/ai/controller/SalesAiController.java                                                |  142 
 src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java                                    |   46 
 src/main/java/com/ruoyi/account/controller/AccountFileController.java                                       |   21 
 src/main/java/com/ruoyi/device/controller/DeviceDefectRecordController.java                                 |   25 
 src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java                               |   16 
 src/main/resources/application-dev.yml                                                                      |    1 
 src/main/java/com/ruoyi/staff/service/StaffSalaryMainService.java                                           |   12 
 src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java                                  |   25 
 src/main/java/com/ruoyi/quality/controller/QualityReportController.java                                     |   34 
 src/main/java/com/ruoyi/project/common/CaptchaController.java                                               |  198 
 src/main/java/com/ruoyi/ai/tools/ApproveTodoTools.java                                                      |   17 
 src/main/java/com/ruoyi/quality/pojo/QualityUnqualified.java                                                |    3 
 src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml                                      |    2 
 src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java                                      |   21 
 src/main/java/com/ruoyi/account/service/sales/AccountSalesService.java                                      |   10 
 src/main/java/com/ruoyi/account/service/financial/AccountPurchaseService.java                               |   10 
 src/main/java/com/ruoyi/quality/controller/QualityUnqualifiedController.java                                |   45 
 src/main/java/com/ruoyi/approve/controller/NotificationManagementController.java                            |   31 
 src/main/java/com/ruoyi/account/controller/AccountExpenseController.java                                    |   43 
 src/main/java/com/ruoyi/account/controller/BorrowInfoController.java                                        |   14 
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPlanController.java                         |   18 
 src/main/java/com/ruoyi/account/bean/vo/financial/AccountSubjectVo.java                                     |    4 
 src/main/java/com/ruoyi/project/system/controller/SysConfigController.java                                  |  256 
 src/main/java/com/ruoyi/project/monitor/controller/ServerController.java                                    |   55 
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseReturnOrdersServiceImpl.java                          |    8 
 src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml                                              |    2 
 src/main/java/com/ruoyi/account/bean/dto/purchase/PurchaseInboundDto.java                                   |    2 
 src/main/java/com/ruoyi/ai/tools/PurchaseAgentTools.java                                                    |   56 
 src/main/java/com/ruoyi/equipmentenergyconsumption/service/EquipmentEnergyConsumptionService.java           |    4 
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java                       |   76 
 src/main/java/com/ruoyi/project/monitor/controller/CacheController.java                                     |  223 
 src/main/java/com/ruoyi/device/service/MaintenanceTaskService.java                                          |   10 
 src/main/java/com/ruoyi/projectManagement/controller/PlanController.java                                    |   17 
 src/main/java/com/ruoyi/sales/controller/PaymentShippingController.java                                     |   20 
 src/main/java/com/ruoyi/account/controller/AccountingController.java                                        |    8 
 src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java                                        |   27 
 src/main/java/com/ruoyi/projectManagement/controller/InfoController.java                                    |   37 
 src/main/java/com/ruoyi/collaborativeApproval/controller/SealApplicationManagementController.java           |   21 
 src/main/java/com/ruoyi/warehouse/controller/WarehouseController.java                                       |   24 
 src/main/java/com/ruoyi/procurementrecord/controller/GasTankWarningController.java                          |   23 
 src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesServiceFileController.java                   |   14 
 src/main/java/com/ruoyi/equipmentenergyconsumption/controller/ElectricityConsumptionAreaController.java     |   16 
 src/main/java/com/ruoyi/lavorissue/controller/LavorIssueController.java                                     |   26 
 src/main/java/com/ruoyi/project/system/controller/SysRoleController.java                                    |  520 +-
 src/main/java/com/ruoyi/account/bean/vo/sales/SalesReturnVo.java                                            |    2 
 src/main/java/com/ruoyi/account/service/BorrowInfoService.java                                              |   10 
 src/main/java/com/ruoyi/collaborativeApproval/controller/StaffContactsPersonalController.java               |   17 
 src/main/java/com/ruoyi/sales/controller/InvoiceRegistrationController.java                                 |   31 
 src/main/java/com/ruoyi/staff/service/SchemeApplicableStaffService.java                                     |   10 
 src/main/java/com/ruoyi/project/monitor/controller/SysUserOnlineController.java                             |  165 
 src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java                                                     |    5 
 src/main/resources/sales-agent-prompt.txt                                                                   |    9 
 doc/20260520_首页生产看板性能优化前端变更文档.md                                                                            |  107 
 src/main/java/com/ruoyi/quality/controller/QualityInspectFileController.java                                |   16 
 src/main/java/com/ruoyi/quality/controller/QualityInspectController.java                                    |   47 
 src/main/java/com/ruoyi/ai/controller/XiaozhiController.java                                                |   65 
 src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java                      |   82 
 src/main/java/com/ruoyi/officesupplies/service/OfficeSuppliesService.java                                   |    4 
 src/main/java/com/ruoyi/ai/config/SalesAgentConfig.java                                                     |   21 
 src/main/java/com/ruoyi/staff/service/impl/StaffSalaryMainServiceImpl.java                                  |   34 
 src/main/java/com/ruoyi/procurementrecord/controller/ReturnManagementController.java                        |   32 
 src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java                                       |   17 
 src/main/java/com/ruoyi/ai/assistant/SalesIntentExecutor.java                                               |  270 +
 src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerTemplateController.java                           |   19 
 src/main/java/com/ruoyi/stock/mapper/StockOutRecordMapper.java                                              |    4 
 src/main/java/com/ruoyi/purchase/mapper/PurchaseReturnOrdersMapper.java                                     |    4 
 src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java                                       |  185 
 src/main/java/com/ruoyi/approve/controller/KnowledgeBaseController.java                                     |   23 
 src/main/java/com/ruoyi/collaborativeApproval/controller/NoticeTypeController.java                          |   19 
 src/main/resources/manufacturing-agent-prompt.txt                                                           |    2 
 src/main/java/com/ruoyi/account/mapper/financial/AccountSubjectMapper.java                                  |    4 
 src/main/java/com/ruoyi/account/service/impl/financial/FinVoucherServiceImpl.java                           |    4 
 doc/20260518_销售助手前端联调文档.md                                                                                  |  188 
 src/main/java/com/ruoyi/staff/controller/StaffSchedulingController.java                                     |   25 
 src/main/java/com/ruoyi/account/bean/dto/financial/AccountSubjectImportDto.java                             |    2 
 src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingController.java                         |    2 
 src/main/java/com/ruoyi/project/system/controller/SysDictDataController.java                                |  241 
 src/main/java/com/ruoyi/ai/tools/SalesAgentTools.java                                                       | 1475 ++++++
 src/main/java/com/ruoyi/procurementrecord/controller/InboundManagementController.java                       |   20 
 src/main/java/com/ruoyi/account/bean/vo/sales/SalesOutboundVo.java                                          |    2 
 src/main/java/com/ruoyi/ai/assistant/PurchaseAgent.java                                                     |    3 
 src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java                                         |   21 
 src/main/resources/mapper/stock/StockOutRecordMapper.xml                                                    |    8 
 src/main/java/com/ruoyi/account/bean/dto/purchase/PurchaseReturnDto.java                                    |    2 
 src/main/java/com/ruoyi/procurementrecord/mapper/ReturnManagementMapper.java                                |    4 
 src/main/java/com/ruoyi/waterrecord/service/WaterRecordService.java                                         |    4 
 src/main/java/com/ruoyi/warehouse/controller/DocumentationFileController.java                               |   19 
 src/main/java/com/ruoyi/production/mapper/ProductionOrderMapper.java                                        |   21 
 src/main/java/com/ruoyi/projectManagement/controller/RolesController.java                                   |   27 
 src/main/java/com/ruoyi/ai/assistant/PurchaseIntentExecutor.java                                            |  249 
 src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesNearExpiryController.java                    |   18 
 src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java                             |    8 
 src/main/java/com/ruoyi/staff/controller/StaffSalaryMainController.java                                     |   15 
 src/main/java/com/ruoyi/compensationperformance/controller/CompensationPerformanceController.java           |   24 
 src/main/java/com/ruoyi/account/controller/purchase/AccounPurchaseController.java                           |   12 
 src/main/java/com/ruoyi/ai/controller/PurchaseAiController.java                                             |   25 
 src/main/java/com/ruoyi/sales/controller/InvoiceLedgerController.java                                       |   71 
 src/main/java/com/ruoyi/measuringinstrumentledger/controller/MeasuringInstrumentLedgerRecordController.java |   18 
 src/main/java/com/ruoyi/account/service/impl/BorrowInfoServiceImpl.java                                     |   24 
 src/main/java/com/ruoyi/purchase/controller/PurchaseReturnOrdersController.java                             |   25 
 src/main/resources/mapper/purchase/PurchaseReturnOrdersMapper.xml                                           |    2 
 src/main/java/com/ruoyi/officesupplies/service/impl/OfficeSuppliesServiceImpl.java                          |    6 
 src/main/java/com/ruoyi/quality/controller/QualityInspectParamController.java                               |   25 
 src/main/java/com/ruoyi/stock/controller/StockInRecordController.java                                       |   27 
 src/main/java/com/ruoyi/framework/web/controller/BaseController.java                                        |   36 
 src/main/java/com/ruoyi/stock/mapper/StockInRecordMapper.java                                               |    4 
 src/main/java/com/ruoyi/device/service/IDeviceRepairService.java                                            |   10 
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java                                      |   80 
 src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java                                   |   43 
 src/main/java/com/ruoyi/basic/service/IProductModelService.java                                             |    4 
 src/main/java/com/ruoyi/ai/service/PurchaseAiService.java                                                   |  156 
 src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesServiceController.java                       |   36 
 src/main/resources/mapper/stock/StockInventoryMapper.xml                                                    |    6 
 src/main/java/com/ruoyi/account/controller/AccountIncomeController.java                                     |   35 
 src/main/java/com/ruoyi/basic/pojo/SupplierManage.java                                                      |    9 
 src/main/java/com/ruoyi/device/controller/DeviceMaintenanceFileController.java                              |   19 
 src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java                                              |    4 
 src/main/java/com/ruoyi/equipmentenergyconsumption/controller/EquipmentEnergyConsumptionController.java     |   34 
 src/main/java/com/ruoyi/purchase/controller/PaymentRegistrationController.java                              |   50 
 src/main/java/com/ruoyi/purchase/controller/ProcurementBusinessSummaryController.java                       |    6 
 src/main/java/com/ruoyi/production/service/ProductionOrderRoutingOperationService.java                      |    2 
 src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsRequisitionRecordController.java     |    9 
 src/main/resources/mapper/account/financial/AccountSubjectMapper.xml                                        |    4 
 src/main/java/com/ruoyi/ai/assistant/SalesAgent.java                                                        |   22 
 src/main/java/com/ruoyi/project/tool/gen/controller/GenController.java                                      |  508 +-
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementExceptionRecordController.java              |   10 
 src/main/java/com/ruoyi/device/controller/MaintenanceTaskController.java                                    |   10 
 src/main/java/com/ruoyi/project/monitor/controller/SysJobController.java                                    |  374 
 src/main/java/com/ruoyi/purchase/service/IProductRecordService.java                                         |    4 
 src/main/java/com/ruoyi/equipmentenergyconsumption/controller/EnergyPeriodController.java                   |   24 
 src/main/java/com/ruoyi/technology/controller/TechnologyOperationParamController.java                       |    8 
 src/main/java/com/ruoyi/project/system/controller/SysRegisterController.java                                |   66 
 src/main/java/com/ruoyi/purchase/service/impl/ProductRecordServiceImpl.java                                 |    8 
 src/main/java/com/ruoyi/device/controller/DeviceRepairController.java                                       |   27 
 src/main/java/com/ruoyi/account/controller/sales/AccountSalesController.java                                |   12 
 src/main/java/com/ruoyi/basic/controller/ProductController.java                                             |   32 
 src/main/java/com/ruoyi/quality/controller/QualityTestStandardController.java                               |   57 
 src/main/java/com/ruoyi/measuringinstrumentledger/controller/MeasuringInstrumentLedgerController.java       |   34 
 src/main/java/com/ruoyi/purchase/controller/TicketRegistrationController.java                               |   46 
 src/main/java/com/ruoyi/project/system/controller/SysProfileController.java                                 |  268 
 src/main/java/com/ruoyi/sales/controller/ReceiptPaymentController.java                                      |   40 
 src/main/java/com/ruoyi/account/service/purchase/AccountSubjectService.java                                 |    8 
 src/main/java/com/ruoyi/basic/controller/CustomerFollowUpController.java                                    |   46 
 src/main/java/com/ruoyi/collaborativeApproval/controller/NoticeController.java                              |   22 
 src/main/java/com/ruoyi/sales/controller/MetricStatisticsController.java                                    |    6 
 src/main/java/com/ruoyi/staff/controller/BankController.java                                                |   21 
 src/main/java/com/ruoyi/account/service/impl/AccountingServiceImpl.java                                     |   14 
 src/main/java/com/ruoyi/account/bean/dto/sales/SalesOutboundDto.java                                        |    2 
 src/main/java/com/ruoyi/account/bean/vo/purchase/PurchaseReturnVo.java                                      |    2 
 src/main/java/com/ruoyi/production/util/TaskPlanQuantityUtil.java                                           |  137 
 src/main/java/com/ruoyi/project/system/controller/SysDictTypeController.java                                |  265 
 src/main/java/com/ruoyi/basic/controller/SupplierManageFileController.java                                  |   19 
 src/main/java/com/ruoyi/project/system/controller/SysUserClientController.java                              |    8 
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java                               |    3 
 doc/20260521_首页HomeController接口升级前端变更文档.md                                                                  |  113 
 src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementFileController.java      |   19 
 src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java                                  |   31 
 src/main/java/com/ruoyi/ai/assistant/ApproveTodoAgent.java                                                  |    3 
 src/main/java/com/ruoyi/sales/controller/CommonFileController.java                                          |    9 
 src/main/java/com/ruoyi/staff/controller/HolidayApplicationController.java                                  |   21 
 src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsController.java                      |   25 
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java                    |   16 
 src/main/java/com/ruoyi/approve/controller/RpaProcessAutomationController.java                              |   23 
 src/main/resources/purchase-agent-prompt.txt                                                                |    9 
 src/main/java/com/ruoyi/project/system/controller/SysNoticeController.java                                  |  195 
 src/main/java/com/ruoyi/device/service/impl/DeviceLedgerServiceImpl.java                                    |   16 
 src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java                                 |   23 
 src/main/java/com/ruoyi/basic/excel/SupplierManageExcelDto.java                                             |    3 
 src/main/java/com/ruoyi/ai/assistant/ManufacturingAgent.java                                                |    3 
 src/main/java/com/ruoyi/basic/service/ISupplierService.java                                                 |    4 
 src/main/java/com/ruoyi/warehouse/controller/DocumentationBorrowManagementController.java                   |   46 
 src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java                           |   17 
 src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java                                 |    2 
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPriceManagementController.java              |   20 
 src/main/java/com/ruoyi/stock/dto/StockOutRecordDto.java                                                    |    4 
 src/main/resources/mapper/basic/CustomerMapper.xml                                                          |    1 
 src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java                                        |    4 
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java                                |   14 
 src/main/java/com/ruoyi/project/system/controller/SysLoginController.java                                   |  311 
 src/main/java/com/ruoyi/project/system/controller/SysDeptController.java                                    |  271 
 src/main/java/com/ruoyi/officesupplies/controller/OfficeSuppliesController.java                             |   18 
 src/main/java/com/ruoyi/staff/controller/StaffContractController.java                                       |    9 
 src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java                                       |   37 
 src/main/java/com/ruoyi/sales/dto/SalesLedgerImportDto.java                                                 |    4 
 src/main/java/com/ruoyi/project/system/controller/SysUserController.java                                    |  577 +-
 src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationServiceImpl.java             |  149 
 src/main/java/com/ruoyi/customervisits/service/CustomerVisitsService.java                                   |    2 
 src/main/resources/approve-todo-agent-prompt.txt                                                            |    2 
 src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java                            |   28 
 src/main/java/com/ruoyi/basic/controller/SupplierManageController.java                                      |   36 
 src/main/resources/static/销售台账导入模板.xlsx                                                                     |    0 
 src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementController.java          |   37 
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java                    |   26 
 src/main/java/com/ruoyi/device/service/IDeviceMaintenanceService.java                                       |    6 
 src/main/java/com/ruoyi/project/monitor/controller/SysOperlogController.java                                |  140 
 src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java                                     |   20 
 src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java                                          |   45 
 src/main/resources/mapper/stock/StockInRecordMapper.xml                                                     |    8 
 src/main/java/com/ruoyi/account/pojo/financial/AccountSubject.java                                          |    2 
 src/main/java/com/ruoyi/collaborativeApproval/controller/DutyPlanController.java                            |   25 
 src/main/java/com/ruoyi/warehouse/controller/DocumentClassificationController.java                          |   20 
 src/main/resources/mapper/production/ProductionOperationTaskMapper.xml                                      |    3 
 src/main/java/com/ruoyi/quality/controller/QualityTestStandardBindingController.java                        |   27 
 src/main/java/com/ruoyi/production/bean/dto/ProductionOperationTaskDto.java                                 |    3 
 src/main/java/com/ruoyi/customervisits/controller/CustomerVisitsController.java                             |   26 
 src/main/java/com/ruoyi/account/bean/dto/financial/AccountSubjectDto.java                                   |    4 
 src/main/java/com/ruoyi/project/monitor/controller/SysJobLogController.java                                 |  186 
 src/main/java/com/ruoyi/sales/service/impl/MetricStatisticsServiceImpl.java                                 |   14 
 src/main/java/com/ruoyi/account/service/impl/financial/AccountSubjectServiceImpl.java                       |   14 
 src/main/java/com/ruoyi/home/controller/HomeController.java                                                 |  585 ++
 src/main/java/com/ruoyi/warehouse/controller/WarehouseGoodsShelvesController.java                           |   20 
 src/main/java/com/ruoyi/account/bean/dto/sales/SalesReturnDto.java                                          |    2 
 src/main/java/com/ruoyi/device/service/IDeviceLedgerService.java                                            |    6 
 src/main/java/com/ruoyi/staff/controller/StaffLeaveController.java                                          |   23 
 src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java                                         |   40 
 src/main/java/com/ruoyi/project/monitor/controller/SysLogininforController.java                             |  141 
 src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java                                      |   36 
 src/main/java/com/ruoyi/warehouse/controller/WarehouseGoodsShelvesRowcolController.java                     |    6 
 doc/20260521_采购智能体优化前端变更文档.md                                                                               |   85 
 src/main/java/com/ruoyi/approve/controller/HolidaySettingsController.java                                   |   77 
 src/main/java/com/ruoyi/purchase/controller/AccountingReportController.java                                 |   13 
 src/main/java/com/ruoyi/waterrecord/controller/WaterRecordController.java                                   |   22 
 src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java                                    |   38 
 src/main/java/com/ruoyi/sales/dto/SalesLedgerProductImportDto.java                                          |    7 
 src/main/java/com/ruoyi/account/bean/vo/purchase/PurchaseInboundVo.java                                     |    2 
 src/main/java/com/ruoyi/account/service/impl/purchase/AccountPurchaseServiceImpl.java                       |   12 
 src/main/java/com/ruoyi/ai/controller/ManufacturingAiController.java                                        |   27 
 src/main/java/com/ruoyi/project/system/controller/SysPostController.java                                    |  268 
 src/main/java/com/ruoyi/warehouse/controller/DocumentationController.java                                   |   36 
 src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java                                                    |    3 
 src/main/java/com/ruoyi/staff/controller/AnalyticsController.java                                           |   17 
 doc/20260520_首页生产看板前端联调文档.md                                                                                |  160 
 src/main/java/com/ruoyi/waterrecord/service/impl/WaterRecordServiceImpl.java                                |   11 
 src/main/resources/mapper/production/ProductionOrderMapper.xml                                              |   81 
 src/main/java/com/ruoyi/equipmentenergyconsumption/service/impl/EquipmentEnergyConsumptionServiceImpl.java  |   11 
 src/main/java/com/ruoyi/staff/controller/SchemeApplicableStaffController.java                               |   10 
 src/main/java/com/ruoyi/purchase/controller/InvoicePurchaseController.java                                  |   12 
 src/main/java/com/ruoyi/account/service/impl/sales/AccountSalesServiceImpl.java                             |   12 
 src/main/java/com/ruoyi/quality/controller/QualityTestStandardParamController.java                          |   33 
 243 files changed, 8,890 insertions(+), 4,734 deletions(-)

diff --git "a/doc/20260518_\351\224\200\345\224\256\345\212\251\346\211\213\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243.md" "b/doc/20260518_\351\224\200\345\224\256\345\212\251\346\211\213\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243.md"
new file mode 100644
index 0000000..d0c6e40
--- /dev/null
+++ "b/doc/20260518_\351\224\200\345\224\256\345\212\251\346\211\213\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243.md"
@@ -0,0 +1,188 @@
+# 閿�鍞姪鎵嬪墠绔仈璋冩枃妗o紙`/sales-ai`锛�
+> 鏇存柊鏃堕棿锛�2026-05-18  
+> 閫傜敤妯″潡锛氬鎴锋。妗堬紙绉佹捣/鍏捣锛夈�侀攢鍞姤浠枫�侀攢鍞彴璐︺�侀攢鍞��璐с�佸鎴峰線鏉ャ�佸彂璐у彴璐︺�佹寚鏍囩粺璁�  
+> 閲嶇偣鑳藉姏锛氬鎴锋祦澶遍闄╁垎鏋愩�佸洖娆句笌鎶ヤ环绛栫暐寤鸿
+
+## 1. 鎺ュ彛鎬昏
+
+1. 娴佸紡瀵硅瘽锛歚POST /sales-ai/chat`
+2. 浼氳瘽鍒楄〃锛歚GET /sales-ai/history/sessions`
+3. 浼氳瘽娑堟伅锛歚GET /sales-ai/history/messages/{memoryId}`
+4. 鍒犻櫎浼氳瘽锛歚DELETE /sales-ai/history/{memoryId}`
+
+璇存槑锛�
+- `/chat` 杩斿洖 `text/stream;charset=utf-8`锛圫SE 鏂囨湰娴侊級銆�
+- 鍛戒腑宸ュ叿鏃讹紝鏈�缁堝唴瀹逛负 **JSON 瀛楃涓�**锛堥潪 `AjaxResult`锛夈��
+- 鏈懡涓伐鍏锋椂锛岃繑鍥炴櫘閫氫腑鏂囨枃鏈��
+
+## 2. 瀵硅瘽鎺ュ彛
+
+### 2.1 璇锋眰
+
+```http
+POST /sales-ai/chat
+Content-Type: application/json
+```
+
+```json
+{
+  "memoryId": "sales-ai-001",
+  "message": "甯垜鍋氬鎴锋祦澶遍闄╁垎鏋愶紝杩�90澶╋紝鍓�10鏉�"
+}
+```
+
+瀛楁璇存槑锛�
+
+| 瀛楁 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+| --- | --- | --- | --- |
+| `memoryId` | string | 鏄� | 浼氳瘽 ID锛屽墠绔敓鎴愬苟澶嶇敤 |
+| `message` | string | 鏄� | 鐢ㄦ埛杈撳叆 |
+
+### 2.2 杩斿洖澶勭悊
+
+鍓嶇寤鸿娴佺▼锛�
+1. 鍏堟寜娴佹嫾鎺ュ畬鏁存枃鏈� `fullText`銆�
+2. 灏濊瘯 `JSON.parse(fullText)`锛�
+   - 鎴愬姛锛氭寜 `type` 璺敱鍒扮粨鏋勫寲缁勪欢銆�
+   - 澶辫触锛氭寜鏅�氳亰澶╂枃鏈睍绀恒��
+
+## 3. 缁撴瀯鍖栧搷搴斿崗璁�
+
+### 3.1 閫氱敤缁撴瀯
+
+```json
+{
+  "success": true,
+  "type": "sales_dashboard",
+  "description": "宸茶繑鍥為攢鍞寚鏍囩粺璁�",
+  "summary": {},
+  "data": {},
+  "charts": {}
+}
+```
+
+### 3.2 `type` 鏋氫妇
+
+| type | 鍦烘櫙 |
+| --- | --- |
+| `sales_customer_profile_list` | 瀹㈡埛妗f锛堢娴�/鍏捣锛� |
+| `sales_quotation_list` | 閿�鍞姤浠� |
+| `sales_ledger_list` | 閿�鍞彴璐� |
+| `sales_return_list` | 閿�鍞��璐� |
+| `sales_customer_interaction_list` | 瀹㈡埛寰�鏉ワ紙鍥炴锛� |
+| `sales_shipping_list` | 鍙戣揣鍙拌处 |
+| `sales_dashboard` | 鎸囨爣缁熻 |
+| `sales_customer_churn_risk` | 瀹㈡埛娴佸け椋庨櫓鍒嗘瀽 |
+| `sales_collection_quote_strategy` | 鍥炴涓庢姤浠风瓥鐣ュ缓璁� |
+
+## 4. 鑿滃崟鑳藉姏鏄犲皠锛堝搴旇惀閿�绠$悊锛�
+
+1. 瀹㈡埛妗f锛堢娴凤級锛氱ず渚嬫彁闂� `鏌ヨ绉佹捣瀹㈡埛妗f鍓�10鏉
+2. 瀹㈡埛妗f锛堝叕娴凤級锛氱ず渚嬫彁闂� `鏌ヨ鍏捣瀹㈡埛妗f`
+3. 閿�鍞姤浠凤細绀轰緥鎻愰棶 `鏌ヨ鏈湀閿�鍞姤浠穈
+4. 閿�鍞彴璐︼細绀轰緥鎻愰棶 `鏌ヨ鏈湀閿�鍞彴璐
+5. 閿�鍞��璐э細绀轰緥鎻愰棶 `鏌ヨ杩�30澶╅攢鍞��璐
+6. 瀹㈡埛寰�鏉ワ細绀轰緥鎻愰棶 `鏌ヨ杩�30澶╁鎴峰洖娆惧線鏉
+7. 鍙戣揣鍙拌处锛氱ず渚嬫彁闂� `鏌ヨ鏈湀鍙戣揣鍙拌处`
+8. 鎸囨爣缁熻锛氱ず渚嬫彁闂� `鏌ョ湅閿�鍞寚鏍囩粺璁
+
+## 5. 閲嶇偣鑳藉姏鑱旇皟
+
+### 5.1 瀹㈡埛娴佸け椋庨櫓鍒嗘瀽锛坄sales_customer_churn_risk`锛�
+
+鏁版嵁浣嶇疆锛�
+- 鍒楄〃锛歚data.items`
+- 姹囨�伙細`summary.highRiskCount / mediumRiskCount / lowRiskCount`
+- 鍥捐〃锛歚charts.riskLevelPieOption`銆乣charts.riskScoreBarOption`
+
+鍗曢」甯哥敤瀛楁锛�
+- `customerName`
+- `riskLevel`锛坄high`/`medium`/`low`锛�
+- `riskScore`锛�0-100锛�
+- `pendingAmount`
+- `pendingRate`
+- `daysSinceLastOrder`
+- `riskReasons`锛堝瓧绗︿覆鏁扮粍锛�
+
+### 5.2 鍥炴涓庢姤浠风瓥鐣ュ缓璁紙`sales_collection_quote_strategy`锛�
+
+鏁版嵁浣嶇疆锛�
+- 绛栫暐鍗★細`data.items`
+- 姹囨�伙細`summary.highPriorityCount / mediumPriorityCount / lowPriorityCount`
+- 鍥捐〃锛歚charts.pendingAmountBarOption`銆乣charts.priorityPieOption`
+
+鍗曢」甯哥敤瀛楁锛�
+- `customerName`
+- `priority`锛坄high`/`medium`/`low`锛�
+- `pendingAmount`
+- `quoteConversionRate`
+- `collectionStrategy`
+- `quotationStrategy`
+- `nextAction`
+
+## 6. 鎸囨爣缁熻鑱旇皟锛坄sales_dashboard`锛�
+
+鍏抽敭瀛楁锛�
+- `summary.contractAmountTotal`
+- `summary.receivedAmountTotal`
+- `summary.pendingAmountTotal`
+- `summary.shipRate`
+
+鍥捐〃瀛楁锛堝彲鐩存帴缁� ECharts锛夛細
+- `charts.amountBarOption`
+- `charts.shippingPieOption`
+- `charts.customerTopBarOption`
+- `charts.contractTrendLineOption`
+
+闄勫姞鏁版嵁锛�
+- `data.topCustomers`
+- `data.contractTrend`
+
+## 7. 浼氳瘽鍘嗗彶鎺ュ彛
+
+### 7.1 浼氳瘽鍒楄〃
+
+```http
+GET /sales-ai/history/sessions
+```
+
+杩斿洖 `AjaxResult.data` 瀛楁锛�
+- `memoryId`
+- `title`
+- `lastMessage`
+- `messageCount`
+- `lastChatTime`
+
+### 7.2 浼氳瘽娑堟伅
+
+```http
+GET /sales-ai/history/messages/{memoryId}
+```
+
+杩斿洖 `AjaxResult.data` 瀛楁锛�
+- `role`锛歚user` / `assistant` / `system` / `tool`
+- `content`
+- `filePaths`锛堝綋鍓嶉攢鍞姪鎵嬫湭浣跨敤鏂囦欢鍒嗘瀽锛屽彲蹇界暐锛�
+
+### 7.3 鍒犻櫎浼氳瘽
+
+```http
+DELETE /sales-ai/history/{memoryId}
+```
+
+杩斿洖鏍囧噯 `AjaxResult`銆�
+
+## 8. 鍓嶇鎺ュ叆绾︽潫
+
+1. 鏂板鍔╂墜閰嶇疆鏃讹紝`assistantRegistry` 蹇呴』娉ㄥ唽 `sales`锛堟垨浣犳柟绾﹀畾 key锛夛紝骞舵寚鍚� `apiBase = /sales-ai`銆�
+2. 缁撴瀯鍖栨覆鏌撳繀椤诲熀浜� `type` 鍒嗗彂锛屼笉瑕佷粎闈犲叧閿瘝銆�
+3. 鑱婂ぉ娓叉煋闇�淇濈暀鈥滄枃鏈厹搴曗�濓紝閬垮厤 JSON 瑙f瀽澶辫触鏃堕〉闈㈢┖鐧姐��
+4. 涓氬姟灞曠ず瀛楁寤鸿涓枃鍖栵紝涓嶇洿鎺ュ睍绀鸿嫳鏂囧瓧娈� key銆�
+
+## 9. 鑱旇皟楠屾敹娓呭崟
+
+1. 鑳芥甯告祦寮忔帴鏀� `/sales-ai/chat` 鍝嶅簲骞舵嫾鎺ユ枃鏈��
+2. 鑳芥寜 `type` 姝g‘娓叉煋 9 绫荤粨鏋勫寲缁撴灉銆�
+3. 鑳芥纭睍绀衡�滃鎴锋祦澶遍闄╁垎鏋愨�濆拰鈥滃洖娆句笌鎶ヤ环绛栫暐寤鸿鈥濅袱涓噸鐐瑰満鏅��
+4. 浼氳瘽鍒楄〃銆佷細璇濇秷鎭�佸垹闄や細璇濆叏閾捐矾鍙敤銆�
+5. `memoryId` 澶嶇敤鍚庡彲鍥炵湅鍘嗗彶锛屼笉浼氫覆浼氳瘽銆�
diff --git "a/doc/20260520_\351\246\226\351\241\265\347\224\237\344\272\247\347\234\213\346\235\277\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243.md" "b/doc/20260520_\351\246\226\351\241\265\347\224\237\344\272\247\347\234\213\346\235\277\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243.md"
new file mode 100644
index 0000000..aaa6055
--- /dev/null
+++ "b/doc/20260520_\351\246\226\351\241\265\347\224\237\344\272\247\347\234\213\346\235\277\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243.md"
@@ -0,0 +1,160 @@
+# 棣栭〉鐢熶骇鐪嬫澘鍓嶇鑱旇皟鏂囨。
+
+鏇存柊鏃堕棿锛�2026-05-20  
+妯″潡锛歚/home`锛堥椤碉級
+
+## 1. 鎺ュ彛娓呭崟
+
+1. `GET /home/productionOverview`锛氱敓浜ф�昏  
+2. `GET /home/productionRealtimeBoard`锛氱敓浜у疄鏃剁湅鏉�  
+3. `GET /home/productionOrderProgress`锛氱敓浜ц鍗曡繘搴�  
+4. `GET /home/todayProductionPlan`锛氫粖鏃ョ敓浜ц鍒�
+
+鎵�鏈夋帴鍙g粺涓�杩斿洖 `AjaxResult`锛�
+
+```json
+{
+  "code": 200,
+  "msg": "鎿嶄綔鎴愬姛",
+  "data": {}
+}
+```
+
+## 2. 鐢熶骇鎬昏
+
+### 2.1 璇锋眰
+
+```http
+GET /home/productionOverview
+```
+
+### 2.2 杩斿洖 `data`
+
+```json
+{
+  "totalOutput": 1280.00,
+  "totalScrap": 25.00,
+  "yieldRate": 98.08
+}
+```
+
+瀛楁璇存槑锛�
+
+- `totalOutput`锛氱疮璁′骇鍑猴紙浠讹紝鍚堟牸鏁帮級
+- `totalScrap`锛氱疮璁℃姤搴燂紙浠讹級
+- `yieldRate`锛氳壇鐜囷紙0-100锛屽墠绔睍绀烘椂鍙嫾鎺� `%`锛�
+
+## 3. 鐢熶骇瀹炴椂鐪嬫澘
+
+### 3.1 璇锋眰
+
+```http
+GET /home/productionRealtimeBoard
+```
+
+### 3.2 杩斿洖 `data`
+
+```json
+{
+  "deviceOee": {
+    "value": 74.00,
+    "compareYesterday": 2.50
+  },
+  "orderAchievementRate": {
+    "value": 81.30,
+    "compareYesterday": -1.20
+  },
+  "defectRate": {
+    "value": 1.40,
+    "compareYesterday": 0.30
+  }
+}
+```
+
+瀛楁璇存槑锛�
+
+- `value`锛氬綋鏃ユ寚鏍囧�硷紙0-100锛�
+- `compareYesterday`锛氳緝鏄ㄦ棩鍙樺寲鍊硷紙鍙鍙礋锛涘墠绔寜姝h礋鍐冲畾绠ご鏂瑰悜鍜岄鑹诧級
+
+## 4. 鐢熶骇璁㈠崟杩涘害
+
+### 4.1 璇锋眰
+
+```http
+GET /home/productionOrderProgress?tab=all&pageNum=1&pageSize=10
+```
+
+鍙傛暟锛�
+
+- `tab`锛歚all` / `inProgress` / `completed` / `paused`
+- `pageNum`锛氶〉鐮侊紙榛樿 `1`锛�
+- `pageSize`锛氭瘡椤垫潯鏁帮紙榛樿 `10`锛屾渶澶� `50`锛�
+
+### 4.2 杩斿洖 `data`
+
+```json
+{
+  "tab": "all",
+  "total": 24,
+  "pageNum": 1,
+  "pageSize": 10,
+  "inProgressCount": 6,
+  "completedCount": 12,
+  "pausedCount": 2,
+  "records": [
+    {
+      "orderNo": "MO-20260518-001",
+      "productName": "鏅鸿兘鎺у埗鍣�",
+      "plannedQuantity": 1000.00,
+      "completedQuantity": 860.00,
+      "completionRate": 86.00,
+      "dueDate": "2026-05-20",
+      "status": 2,
+      "statusLabel": "杩涜涓�"
+    }
+  ]
+}
+```
+
+瀛楁璇存槑锛�
+
+- `completionRate`锛氬畬鎴愮巼锛�0-100锛�
+- `status`锛氬悗绔姸鎬佺爜锛坄1`寰呭紑濮嬶紝`2`杩涜涓紝`3`宸插畬鎴愶紝`4`宸叉殏鍋滐級
+- `statusLabel`锛氱姸鎬佷腑鏂囧睍绀哄��
+
+## 5. 浠婃棩鐢熶骇璁″垝
+
+### 5.1 璇锋眰
+
+```http
+GET /home/todayProductionPlan?limit=4
+```
+
+鍙傛暟锛�
+
+- `limit`锛氳繑鍥炴潯鏁帮紙榛樿 `4`锛屾渶澶� `20`锛�
+
+### 5.2 杩斿洖 `data`
+
+```json
+{
+  "total": 9,
+  "records": [
+    {
+      "orderNo": "MO-20260518-004",
+      "productName": "缁撴瀯浠禔",
+      "plannedQuantity": 1200.00,
+      "dueDate": "2026-05-15",
+      "status": 2,
+      "statusLabel": "杩涜涓�"
+    }
+  ]
+}
+```
+
+## 6. 鍓嶇灞曠ず绾﹀畾
+
+- 鐧惧垎姣斿瓧娈电粺涓�鏄暟鍊硷紙濡� `74.00`锛夛紝鍓嶇鑷鎷兼帴 `%`銆�
+- 鎵�鏈夋暟鍊间繚鐣欎袱浣嶅皬鏁般��
+- `dueDate` 鍙兘涓� `null`锛屽墠绔渶鍏滃簳灞曠ず锛堝 `--`锛夈��
+- `compareYesterday` 姝h礋閮藉彲鑳藉嚭鐜帮紝寤鸿鎸� `>0` 涓婂崌銆乣<0` 涓嬮檷銆乣=0` 鎸佸钩澶勭悊銆�
diff --git "a/doc/20260520_\351\246\226\351\241\265\347\224\237\344\272\247\347\234\213\346\235\277\346\200\247\350\203\275\344\274\230\345\214\226\345\211\215\347\253\257\345\217\230\346\233\264\346\226\207\346\241\243.md" "b/doc/20260520_\351\246\226\351\241\265\347\224\237\344\272\247\347\234\213\346\235\277\346\200\247\350\203\275\344\274\230\345\214\226\345\211\215\347\253\257\345\217\230\346\233\264\346\226\207\346\241\243.md"
new file mode 100644
index 0000000..730dbf1
--- /dev/null
+++ "b/doc/20260520_\351\246\226\351\241\265\347\224\237\344\272\247\347\234\213\346\235\277\346\200\247\350\203\275\344\274\230\345\214\226\345\211\215\347\253\257\345\217\230\346\233\264\346\226\207\346\241\243.md"
@@ -0,0 +1,107 @@
+# 棣栭〉鐢熶骇鐪嬫澘鎬ц兘浼樺寲鍓嶇鍙樻洿鏂囨。
+
+鏇存柊鏃堕棿锛�2026-05-20  
+閫傜敤椤甸潰锛氶椤�  
+娑夊強鍖哄潡锛�
+
+1. 鐢熶骇璁㈠崟杩涘害
+2. 浠婃棩鐢熶骇璁″垝
+
+## 1. 鏈浼樺寲鐩爣
+
+閽堝澶ф暟鎹噺鍦烘櫙锛堣鍗曟暟閲忓銆佺敓浜у巻鍙查暱锛変紭鍖栨煡璇㈡�ц兘锛岄檷浣庨椤垫帴鍙e搷搴旀椂闂村拰鍐呭瓨鍗犵敤銆�
+
+## 2. 娑夊強鎺ュ彛
+
+1. `GET /home/productionOrderProgress`
+2. `GET /home/todayProductionPlan`
+
+## 3. 鍓嶇鏄惁闇�瑕佹敼浠g爜
+
+缁撹锛�**鏃犲己鍒舵敼鍔紝鎺ュ彛鍏ュ弬涓庤繑鍥炵粨鏋勪繚鎸佸吋瀹�**銆�  
+浣犵幇鏈夐〉闈㈠彲浠ョ洿鎺ヨ仈璋冿紝涓嶉渶瑕佹敼瀛楁鏄犲皠銆�
+
+## 4. 鎺ュ彛璇存槑锛堜繚鎸佷笉鍙橈級
+
+### 4.1 鐢熶骇璁㈠崟杩涘害
+
+璇锋眰锛�
+
+```http
+GET /home/productionOrderProgress?tab=all&pageNum=1&pageSize=10
+```
+
+鍙傛暟锛�
+
+- `tab`锛歚all` / `inProgress` / `completed` / `paused`
+- `pageNum`锛氶〉鐮侊紝榛樿 `1`
+- `pageSize`锛氭瘡椤垫潯鏁帮紝榛樿 `10`锛屾渶澶� `50`
+
+杩斿洖 `data`锛堢粨鏋勪笉鍙橈級锛�
+
+```json
+{
+  "tab": "all",
+  "total": 1200,
+  "pageNum": 1,
+  "pageSize": 10,
+  "inProgressCount": 180,
+  "completedCount": 900,
+  "pausedCount": 20,
+  "records": [
+    {
+      "orderNo": "MO-20260518-001",
+      "productName": "鏅鸿兘鎺у埗鍣�",
+      "plannedQuantity": 1000.00,
+      "completedQuantity": 860.00,
+      "completionRate": 86.00,
+      "dueDate": "2026-05-20",
+      "status": 2,
+      "statusLabel": "杩涜涓�"
+    }
+  ]
+}
+```
+
+### 4.2 浠婃棩鐢熶骇璁″垝
+
+璇锋眰锛�
+
+```http
+GET /home/todayProductionPlan?limit=4
+```
+
+鍙傛暟锛�
+
+- `limit`锛氳繑鍥炴潯鏁帮紝榛樿 `4`锛屾渶澶� `20`
+
+杩斿洖 `data`锛堢粨鏋勪笉鍙橈級锛�
+
+```json
+{
+  "total": 230,
+  "records": [
+    {
+      "orderNo": "MO-20260518-004",
+      "productName": "缁撴瀯浠禔",
+      "plannedQuantity": 1200.00,
+      "dueDate": "2026-05-15",
+      "status": 2,
+      "statusLabel": "杩涜涓�"
+    }
+  ]
+}
+```
+
+## 5. 鍚庣浼樺寲鐐癸紙渚涘墠绔煡鎮夛級
+
+1. 璁㈠崟杩涘害涓庝粖鏃ヨ鍒掓敼涓鸿交閲� SQL锛屼粎鏌ヨ棣栭〉蹇呴渶瀛楁銆�  
+2. 鍘绘帀浜嗛椤垫煡璇㈣矾寰勪腑涓嶅繀瑕佺殑澶у叧鑱斻�佸浘鐗囧~鍏呭拰瀵硅薄瑁呴厤銆�  
+3. 鐘舵�佺粺璁℃敼涓烘暟鎹簱鑱氬悎璁℃暟锛屼笉鍐嶉�愭潯鎷夊彇璁$畻銆�  
+4. 鍒嗛〉涓庢潯鏁颁笂闄愪繚鐣欙紙`pageSize <= 50`, `limit <= 20`锛夈��
+
+## 6. 鍓嶇寤鸿
+
+1. 鍒囨崲 `tab` 鏃朵繚鐣欑幇鏈夎皟鐢ㄦ柟寮忓嵆鍙��  
+2. `dueDate` 鍙兘涓虹┖锛岀户缁寜 `--` 鍏滃簳灞曠ず銆�  
+3. 鐧惧垎姣斿瓧娈典粛涓烘暟鍊硷紝鍓嶇缁х画杩藉姞 `%` 灞曠ず銆�
diff --git "a/doc/20260521_\351\207\207\350\264\255\346\231\272\350\203\275\344\275\223\344\274\230\345\214\226\345\211\215\347\253\257\345\217\230\346\233\264\346\226\207\346\241\243.md" "b/doc/20260521_\351\207\207\350\264\255\346\231\272\350\203\275\344\275\223\344\274\230\345\214\226\345\211\215\347\253\257\345\217\230\346\233\264\346\226\207\346\241\243.md"
new file mode 100644
index 0000000..58089e8
--- /dev/null
+++ "b/doc/20260521_\351\207\207\350\264\255\346\231\272\350\203\275\344\275\223\344\274\230\345\214\226\345\211\215\347\253\257\345\217\230\346\233\264\346\226\207\346\241\243.md"
@@ -0,0 +1,85 @@
+# 閲囪喘鏅鸿兘浣撲紭鍖栧墠绔彉鏇存枃妗�
+
+## 1. 鍙樻洿鑳屾櫙
+
+鏈閽堝閲囪喘鏅鸿兘浣撳仛浜嗗榻愪紭鍖栵紙鍙傝�冮攢鍞�/瀹℃壒/鍒堕�犳櫤鑳戒綋锛夛細
+
+1. 鎻愬崌 `quickPrompts` 鍛戒腑绋冲畾鎬с��
+2. 澧炲己鐩稿鏃堕棿璇嗗埆锛堜粖澶�/鏄ㄥぉ/鏈懆/涓婂懆/鏈湀/涓婃湀/浠婂勾/鍘诲勾/杩慛澶╃瓑锛夈��
+3. 澧炲姞涓氬姟鎰忓浘鏈瘑鍒椂鐨勭粨鏋勫寲鍏滃簳鍝嶅簲锛岄伩鍏嶇紪閫犳暟鎹��
+4. 琛ュ厖寰呬粯娆炬煡璇㈢殑姹囨�诲瓧娈碉紝渚夸簬鍓嶇鐩存帴娓叉煋缁熻鍗$墖銆�
+
+## 2. 鎺ュ彛褰卞搷姒傝
+
+| 鎺ュ彛 | 鏂规硶 | 鏄惁鏀硅矾寰� | 鏄惁鏀瑰叆鍙� | 鏄惁鏀硅繑鍥炵粨鏋� |
+| --- | --- | --- | --- | --- |
+| `/purchase-ai/chat` | POST(SSE) | 鍚� | 鍚� | 鏄紙鏂板鍏滃簳 JSON 绫诲瀷锛� |
+| `/purchase-ai/analyze-files` | POST(SSE) | 鍚� | 鍚� | 鍚︼紙浠呭唴閮ㄦ彁绀鸿瘝澧炲己锛� |
+
+## 3. 鏂板鍏滃簳鍝嶅簲锛堥噸鐐癸級
+
+褰撶敤鎴锋槑鏄惧湪闂噰璐笟鍔★紝浣嗘潯浠朵笉鍏呭垎涓旀湭鍛戒腑鍙墽琛屾剰鍥炬椂锛宍/purchase-ai/chat` 浼氱洿鎺ヨ繑鍥炵粨鏋勫寲 JSON锛堣�屼笉鏄嚜鐢辨枃鏈級锛�
+
+```json
+{
+  "success": false,
+  "type": "purchase_intent_not_recognized",
+  "description": "鏈瘑鍒埌鍙墽琛岀殑閲囪喘鏌ヨ鏉′欢銆備负淇濊瘉缁撴灉鍑嗙‘锛屽綋鍓嶄笉浼氭帹娴嬫垨缂栭�犳暟鎹紝璇疯ˉ鍏呮槑纭椂闂磋寖鍥淬�佷緵搴斿晢銆侀噰璐悎鍚屽彿鎴栫墿鏂欏悗鍐嶆煡璇€��",
+  "summary": {},
+  "data": {
+    "quickPrompts": [
+      "鏈湀閲囪喘閲戦鎺掑悕鍓嶅崄鐨勭墿鏂欐湁鍝簺锛�",
+      "鍝簺閲囪喘璁㈠崟杩樻湭鍏ュ簱锛�",
+      "鏈�杩�7澶╀緵搴斿晢鍒拌揣寮傚父鏈夊摢浜涳紵",
+      "甯垜缁熻寰呬粯娆鹃噰璐崟锛�",
+      "鍒楀嚭鏈湀閲囪喘閫�璐ф儏鍐�"
+    ]
+  },
+  "charts": {}
+}
+```
+
+鍓嶇澶勭悊寤鸿锛�
+
+1. 褰� `type === "purchase_intent_not_recognized"` 鏃讹紝灞曠ず `description`銆�
+2. 璇诲彇 `data.quickPrompts` 浣滀负蹇嵎鎻愰棶鎸夐挳锛堝彲鐩存帴鍥炲~杈撳叆妗嗭級銆�
+
+## 4. 寰呬粯娆捐繑鍥炴柊澧炴眹鎬诲瓧娈�
+
+鎺ュ彛绫诲瀷锛歚type = "purchase_pending_payment_list"`  
+浣嶇疆锛歚summary`
+
+鏂板瀛楁锛�
+
+| 瀛楁 | 绫诲瀷 | 璇存槑 |
+| --- | --- | --- |
+| pendingOrderCount | number | 寰呬粯娆捐鍗曟暟 |
+| totalContractAmount | number | 寰呬粯娆捐鍗曞悎鍚屾�婚 |
+| totalPaidAmount | number | 宸蹭粯娆炬�婚 |
+| totalPendingAmount | number | 寰呬粯娆炬�婚 |
+
+璇存槑锛氬師鏈夊瓧娈典粛淇濈暀锛堝吋瀹癸級锛屾湰娆′负澧為噺瀛楁锛屼笉鐮村潖鐜版湁娓叉煋銆�
+
+## 5. 鏃堕棿鍙e緞浼樺寲
+
+閲囪喘鏅鸿兘浣撶幇鍦ㄧ粺涓�鎸変腑鍥芥椂鍖哄姩鎬佹棩鏈熸崲绠楃浉瀵规椂闂达紝鏀寔锛�
+
+- 浠婂ぉ銆佹槰澶�
+- 鏈懆銆佷笂鍛�
+- 鏈湀銆佷笂鏈�
+- 浠婂勾銆佸幓骞�
+- 杩慛澶�/鍛�/鏈�/骞淬�佽繎鍗婂勾銆佽繎鍗婁釜鏈�
+
+鍓嶇鏃犻渶鏀逛紶鍙傦紝浣嗗睍绀烘椂闂磋寖鍥存椂璇蜂互鍚庣杩斿洖 `summary.startDate/endDate/timeRange` 涓哄噯銆�
+
+## 6. 鍓嶇鑱旇皟妫�鏌ユ竻鍗�
+
+1. `chat` 娴佸紡缁撴灉鎷兼帴鍚庯紝浼樺厛鎸� JSON 瑙f瀽銆�
+2. 瑕嗙洊鏂扮被鍨� `purchase_intent_not_recognized` 鐨� UI 澶勭悊銆�
+3. 寰呬粯娆鹃〉闈㈣鍙栧苟灞曠ず `summary.totalPendingAmount` 绛夋柊澧炲瓧娈点��
+4. 楠岃瘉浠ヤ笅蹇嵎闂鍙ǔ瀹氳繑鍥炵粨鏋勫寲缁撴灉锛�
+   - 鏈湀閲囪喘閲戦鎺掑悕鍓嶅崄鐨勭墿鏂欐湁鍝簺锛�
+   - 鍝簺閲囪喘璁㈠崟杩樻湭鍏ュ簱锛�
+   - 鏈�杩�7澶╀緵搴斿晢鍒拌揣寮傚父鏈夊摢浜涳紵
+   - 甯垜缁熻寰呬粯娆鹃噰璐崟锛�
+   - 鍒楀嚭鏈湀閲囪喘閫�璐ф儏鍐�
diff --git "a/doc/20260521_\351\246\226\351\241\265HomeController\346\216\245\345\217\243\345\215\207\347\272\247\345\211\215\347\253\257\345\217\230\346\233\264\346\226\207\346\241\243.md" "b/doc/20260521_\351\246\226\351\241\265HomeController\346\216\245\345\217\243\345\215\207\347\272\247\345\211\215\347\253\257\345\217\230\346\233\264\346\226\207\346\241\243.md"
new file mode 100644
index 0000000..008660f
--- /dev/null
+++ "b/doc/20260521_\351\246\226\351\241\265HomeController\346\216\245\345\217\243\345\215\207\347\272\247\345\211\215\347\253\257\345\217\230\346\233\264\346\226\207\346\241\243.md"
@@ -0,0 +1,113 @@
+# 棣栭〉 HomeController 鎺ュ彛鍗囩骇鍓嶇鍙樻洿鏂囨。
+
+鏇存柊鏃堕棿锛�2026-05-21  
+閫傜敤妯″潡锛氶椤碉紙`/home`锛�
+
+## 1. 鍙樻洿姒傝
+
+鏈涓� **鍏煎寮忓崌绾�**锛屾棫璋冪敤鏂瑰紡浠嶅彲鐢ㄣ��  
+閲嶇偣鏄粰鐢熶骇鐪嬫澘鎺ュ彛澧炲姞鏇存槑纭殑绛涢�夊弬鏁帮紝渚夸簬鍓嶇鎸夋棩鏈熷拰鐘舵�佹煡璇€��
+
+娑夊強鎺ュ彛锛�
+
+1. `GET /home/productionOrderProgress`
+2. `GET /home/todayProductionPlan`
+
+## 2. 鍙傛暟鍙樻洿
+
+### 2.1 鐢熶骇璁㈠崟杩涘害 `GET /home/productionOrderProgress`
+
+鏃у弬鏁帮紙浠嶅吋瀹癸級锛�
+
+- `tab`锛歚all` / `inProgress` / `completed` / `paused`
+- `pageNum`锛氶粯璁� `1`
+- `pageSize`锛氶粯璁� `10`锛屾渶澶� `50`
+
+鏂板鍙傛暟锛�
+
+- `status`锛堝彲閫夛級锛氱姸鎬佺瓫閫夛紝浼樺厛绾ч珮浜� `tab`  
+  鍙�夊�硷細`all` / `waiting` / `inProgress` / `completed` / `paused` / `1` / `2` / `3` / `4`
+- `bizDate`锛堝彲閫夛級锛氫笟鍔℃棩鏈熺瓫閫夛紝鏍煎紡 `yyyy-MM-dd`锛堟寜璁㈠崟鍒涘缓鏃堕棿杩囨护锛�
+
+鍙傛暟浼樺厛绾э細
+
+1. 濡傛灉浼犱簡 `status`锛屽悗绔紭鍏堟寜 `status` 瑙f瀽锛�
+2. 鏈紶 `status` 鏃讹紝娌跨敤鍘熸湁 `tab` 琛屼负锛�
+3. `status` 鎴� `bizDate` 鏍煎紡閿欒鏃惰繑鍥炲け璐ヤ俊鎭��
+
+璇锋眰绀轰緥锛�
+
+```http
+GET /home/productionOrderProgress?status=completed&bizDate=2026-05-20&pageNum=1&pageSize=10
+```
+
+### 2.2 浠婃棩鐢熶骇璁″垝 `GET /home/todayProductionPlan`
+
+鏃у弬鏁帮紙浠嶅吋瀹癸級锛�
+
+- `limit`锛氶粯璁� `4`锛屾渶澶� `20`
+
+鏂板鍙傛暟锛�
+
+- `planDate`锛堝彲閫夛級锛氳鍒掓棩鏈熺瓫閫夛紝鏍煎紡 `yyyy-MM-dd`锛堟寜 `plan_complete_time` 杩囨护锛�
+
+璇锋眰绀轰緥锛�
+
+```http
+GET /home/todayProductionPlan?limit=6&planDate=2026-05-21
+```
+
+## 3. 杩斿洖缁撴瀯鍙樻洿
+
+### 3.1 `productionOrderProgress` 杩斿洖鏂板瀛楁
+
+鏂板锛�
+
+- `status`锛氭爣鍑嗗寲鐘舵�佸洖鏄撅紙`all` / `waiting` / `inProgress` / `completed` / `paused`锛�
+- `bizDate`锛氭棩鏈熺瓫閫夊洖鏄撅紙鏈紶鏃朵负 `null`锛�
+- `waitingCount`锛氬緟寮�濮嬭鍗曟暟閲�
+
+鍏煎淇濈暀锛�
+
+- `tab` 瀛楁缁х画杩斿洖锛堣�侀〉闈㈡棤闇�鏀瑰姩鍙户缁娇鐢級
+
+杩斿洖绀轰緥锛�
+
+```json
+{
+  "tab": "completed",
+  "status": "completed",
+  "bizDate": "2026-05-20",
+  "total": 24,
+  "pageNum": 1,
+  "pageSize": 10,
+  "waitingCount": 3,
+  "inProgressCount": 6,
+  "completedCount": 12,
+  "pausedCount": 2,
+  "records": []
+}
+```
+
+### 3.2 `todayProductionPlan` 杩斿洖鏂板瀛楁
+
+鏂板锛�
+
+- `planDate`锛氭棩鏈熺瓫閫夊洖鏄撅紙鏈紶鏃朵负 `null`锛�
+
+杩斿洖绀轰緥锛�
+
+```json
+{
+  "planDate": "2026-05-21",
+  "total": 9,
+  "records": []
+}
+```
+
+## 4. 鍓嶇鏀归�犲缓璁�
+
+1. 鏂伴〉闈㈠缓璁紭鍏堜紶 `status`锛岄�愭鏇夸唬 `tab`銆�
+2. 闇�瑕佹寜鏃ユ湡澶嶇洏鐪嬫澘鏃讹紝浣跨敤 `bizDate` / `planDate`銆�
+3. 鑰侀〉闈㈠彲涓嶆敼锛岀户缁部鐢ㄥ師鍙傛暟涔熻兘姝e父鑱旇皟銆�
+
diff --git a/src/main/java/com/ruoyi/account/bean/dto/AccountSubjectDto.java b/src/main/java/com/ruoyi/account/bean/dto/financial/AccountSubjectDto.java
similarity index 60%
rename from src/main/java/com/ruoyi/account/bean/dto/AccountSubjectDto.java
rename to src/main/java/com/ruoyi/account/bean/dto/financial/AccountSubjectDto.java
index e26844d..4d55666 100644
--- a/src/main/java/com/ruoyi/account/bean/dto/AccountSubjectDto.java
+++ b/src/main/java/com/ruoyi/account/bean/dto/financial/AccountSubjectDto.java
@@ -1,6 +1,6 @@
-package com.ruoyi.account.bean.dto;
+package com.ruoyi.account.bean.dto.financial;
 
-import com.ruoyi.account.pojo.AccountSubject;
+import com.ruoyi.account.pojo.financial.AccountSubject;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
diff --git a/src/main/java/com/ruoyi/account/bean/dto/AccountSubjectImportDto.java b/src/main/java/com/ruoyi/account/bean/dto/financial/AccountSubjectImportDto.java
similarity index 94%
rename from src/main/java/com/ruoyi/account/bean/dto/AccountSubjectImportDto.java
rename to src/main/java/com/ruoyi/account/bean/dto/financial/AccountSubjectImportDto.java
index 28c8ab9..7ea5225 100644
--- a/src/main/java/com/ruoyi/account/bean/dto/AccountSubjectImportDto.java
+++ b/src/main/java/com/ruoyi/account/bean/dto/financial/AccountSubjectImportDto.java
@@ -1,4 +1,4 @@
-package com.ruoyi.account.bean.dto;
+package com.ruoyi.account.bean.dto.financial;
 
 import com.ruoyi.framework.aspectj.lang.annotation.Excel;
 import io.swagger.v3.oas.annotations.media.Schema;
diff --git a/src/main/java/com/ruoyi/account/bean/dto/PurchaseInboundDto.java b/src/main/java/com/ruoyi/account/bean/dto/purchase/PurchaseInboundDto.java
similarity index 94%
rename from src/main/java/com/ruoyi/account/bean/dto/PurchaseInboundDto.java
rename to src/main/java/com/ruoyi/account/bean/dto/purchase/PurchaseInboundDto.java
index 757e6b4..9e0a027 100644
--- a/src/main/java/com/ruoyi/account/bean/dto/PurchaseInboundDto.java
+++ b/src/main/java/com/ruoyi/account/bean/dto/purchase/PurchaseInboundDto.java
@@ -1,4 +1,4 @@
-package com.ruoyi.account.bean.dto;
+package com.ruoyi.account.bean.dto.purchase;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
diff --git a/src/main/java/com/ruoyi/account/bean/dto/PurchaseReturnDto.java b/src/main/java/com/ruoyi/account/bean/dto/purchase/PurchaseReturnDto.java
similarity index 94%
rename from src/main/java/com/ruoyi/account/bean/dto/PurchaseReturnDto.java
rename to src/main/java/com/ruoyi/account/bean/dto/purchase/PurchaseReturnDto.java
index c238990..f5adae5 100644
--- a/src/main/java/com/ruoyi/account/bean/dto/PurchaseReturnDto.java
+++ b/src/main/java/com/ruoyi/account/bean/dto/purchase/PurchaseReturnDto.java
@@ -1,4 +1,4 @@
-package com.ruoyi.account.bean.dto;
+package com.ruoyi.account.bean.dto.purchase;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
diff --git a/src/main/java/com/ruoyi/account/bean/dto/SalesOutboundDto.java b/src/main/java/com/ruoyi/account/bean/dto/sales/SalesOutboundDto.java
similarity index 94%
rename from src/main/java/com/ruoyi/account/bean/dto/SalesOutboundDto.java
rename to src/main/java/com/ruoyi/account/bean/dto/sales/SalesOutboundDto.java
index 33bc1b9..ba762e3 100644
--- a/src/main/java/com/ruoyi/account/bean/dto/SalesOutboundDto.java
+++ b/src/main/java/com/ruoyi/account/bean/dto/sales/SalesOutboundDto.java
@@ -1,4 +1,4 @@
-package com.ruoyi.account.bean.dto;
+package com.ruoyi.account.bean.dto.sales;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
diff --git a/src/main/java/com/ruoyi/account/bean/dto/SalesReturnDto.java b/src/main/java/com/ruoyi/account/bean/dto/sales/SalesReturnDto.java
similarity index 94%
rename from src/main/java/com/ruoyi/account/bean/dto/SalesReturnDto.java
rename to src/main/java/com/ruoyi/account/bean/dto/sales/SalesReturnDto.java
index b7ebae2..1c6e266 100644
--- a/src/main/java/com/ruoyi/account/bean/dto/SalesReturnDto.java
+++ b/src/main/java/com/ruoyi/account/bean/dto/sales/SalesReturnDto.java
@@ -1,4 +1,4 @@
-package com.ruoyi.account.bean.dto;
+package com.ruoyi.account.bean.dto.sales;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
diff --git a/src/main/java/com/ruoyi/account/bean/vo/AccountSubjectVo.java b/src/main/java/com/ruoyi/account/bean/vo/financial/AccountSubjectVo.java
similarity index 76%
rename from src/main/java/com/ruoyi/account/bean/vo/AccountSubjectVo.java
rename to src/main/java/com/ruoyi/account/bean/vo/financial/AccountSubjectVo.java
index c6bb078..106eb17 100644
--- a/src/main/java/com/ruoyi/account/bean/vo/AccountSubjectVo.java
+++ b/src/main/java/com/ruoyi/account/bean/vo/financial/AccountSubjectVo.java
@@ -1,6 +1,6 @@
-package com.ruoyi.account.bean.vo;
+package com.ruoyi.account.bean.vo.financial;
 
-import com.ruoyi.account.pojo.AccountSubject;
+import com.ruoyi.account.pojo.financial.AccountSubject;
 import lombok.Data;
 
 import java.util.ArrayList;
diff --git a/src/main/java/com/ruoyi/account/bean/vo/PurchaseInboundVo.java b/src/main/java/com/ruoyi/account/bean/vo/purchase/PurchaseInboundVo.java
similarity index 96%
rename from src/main/java/com/ruoyi/account/bean/vo/PurchaseInboundVo.java
rename to src/main/java/com/ruoyi/account/bean/vo/purchase/PurchaseInboundVo.java
index 934502a..2160674 100644
--- a/src/main/java/com/ruoyi/account/bean/vo/PurchaseInboundVo.java
+++ b/src/main/java/com/ruoyi/account/bean/vo/purchase/PurchaseInboundVo.java
@@ -1,4 +1,4 @@
-package com.ruoyi.account.bean.vo;
+package com.ruoyi.account.bean.vo.purchase;
 
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.fasterxml.jackson.annotation.JsonFormat;
diff --git a/src/main/java/com/ruoyi/account/bean/vo/PurchaseReturnVo.java b/src/main/java/com/ruoyi/account/bean/vo/purchase/PurchaseReturnVo.java
similarity index 96%
rename from src/main/java/com/ruoyi/account/bean/vo/PurchaseReturnVo.java
rename to src/main/java/com/ruoyi/account/bean/vo/purchase/PurchaseReturnVo.java
index e912993..82a90a3 100644
--- a/src/main/java/com/ruoyi/account/bean/vo/PurchaseReturnVo.java
+++ b/src/main/java/com/ruoyi/account/bean/vo/purchase/PurchaseReturnVo.java
@@ -1,4 +1,4 @@
-package com.ruoyi.account.bean.vo;
+package com.ruoyi.account.bean.vo.purchase;
 
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.fasterxml.jackson.annotation.JsonFormat;
diff --git a/src/main/java/com/ruoyi/account/bean/vo/SalesOutboundVo.java b/src/main/java/com/ruoyi/account/bean/vo/sales/SalesOutboundVo.java
similarity index 96%
rename from src/main/java/com/ruoyi/account/bean/vo/SalesOutboundVo.java
rename to src/main/java/com/ruoyi/account/bean/vo/sales/SalesOutboundVo.java
index 5ccdb5b..90d4d53 100644
--- a/src/main/java/com/ruoyi/account/bean/vo/SalesOutboundVo.java
+++ b/src/main/java/com/ruoyi/account/bean/vo/sales/SalesOutboundVo.java
@@ -1,4 +1,4 @@
-package com.ruoyi.account.bean.vo;
+package com.ruoyi.account.bean.vo.sales;
 
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.fasterxml.jackson.annotation.JsonFormat;
diff --git a/src/main/java/com/ruoyi/account/bean/vo/SalesReturnVo.java b/src/main/java/com/ruoyi/account/bean/vo/sales/SalesReturnVo.java
similarity index 96%
rename from src/main/java/com/ruoyi/account/bean/vo/SalesReturnVo.java
rename to src/main/java/com/ruoyi/account/bean/vo/sales/SalesReturnVo.java
index c425737..980d7f8 100644
--- a/src/main/java/com/ruoyi/account/bean/vo/SalesReturnVo.java
+++ b/src/main/java/com/ruoyi/account/bean/vo/sales/SalesReturnVo.java
@@ -1,4 +1,4 @@
-package com.ruoyi.account.bean.vo;
+package com.ruoyi.account.bean.vo.sales;
 
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.fasterxml.jackson.annotation.JsonFormat;
diff --git a/src/main/java/com/ruoyi/account/controller/AccountExpenseController.java b/src/main/java/com/ruoyi/account/controller/AccountExpenseController.java
index 9d49919..ea80191 100644
--- a/src/main/java/com/ruoyi/account/controller/AccountExpenseController.java
+++ b/src/main/java/com/ruoyi/account/controller/AccountExpenseController.java
@@ -8,7 +8,8 @@
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.dto.DateQueryDto;
 import com.ruoyi.framework.security.LoginUser;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import jakarta.annotation.Resource;
@@ -25,7 +26,7 @@
 @RestController
 @RequestMapping("/account/accountExpense")
 @Tag(name = "璐㈠姟绠$悊--鏀嚭绠$悊")
-public class AccountExpenseController {
+public class AccountExpenseController extends BaseController {
 
     @Resource
     private AccountExpenseService accountExpenseService;
@@ -41,11 +42,11 @@
      */
     @PostMapping("/add")
     @Operation(summary = "鏂板")
-    public AjaxResult add(@RequestBody AccountExpense accountExpense) {
+    public R<?> add(@RequestBody AccountExpense accountExpense) {
         accountExpense.setInputTime(new Date());
         LoginUser loginUser = SecurityUtils.getLoginUser();
         accountExpense.setInputUser(loginUser.getNickName());
-        return AjaxResult.success(accountExpenseService.save(accountExpense));
+        return R.ok(accountExpenseService.save(accountExpense));
     }
 
     /**
@@ -55,12 +56,12 @@
      */
     @DeleteMapping("/del")
     @Operation(summary = "鍒犻櫎")
-    public AjaxResult delQualityInspect(@RequestBody List<Integer> ids) {
+    public R<?> delQualityInspect(@RequestBody List<Integer> ids) {
         if(CollectionUtils.isEmpty(ids)){
-            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+            return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         }
         //鍒犻櫎妫�楠屽崟
-        return AjaxResult.success(accountExpenseService.removeBatchByIds(ids));
+        return R.ok(accountExpenseService.removeBatchByIds(ids));
     }
 
     /**
@@ -70,8 +71,8 @@
      */
     @PostMapping("/update")
     @Operation(summary = "淇敼")
-    public AjaxResult update(@RequestBody AccountExpense accountExpense) {
-        return AjaxResult.success(accountExpenseService.updateById(accountExpense));
+    public R<?> update(@RequestBody AccountExpense accountExpense) {
+        return R.ok(accountExpenseService.updateById(accountExpense));
     }
 
     /**
@@ -82,8 +83,8 @@
      */
     @GetMapping("/listPage")
     @Operation(summary = "鍒嗛〉鏌ヨ")
-    public AjaxResult accountExpenseListPage(Page page, AccountExpense accountExpense) {
-        return AjaxResult.success(accountExpenseService.accountExpenseListPage(page, accountExpense));
+    public R<?> accountExpenseListPage(Page page, AccountExpense accountExpense) {
+        return R.ok(accountExpenseService.accountExpenseListPage(page, accountExpense));
     }
 
     /**
@@ -93,8 +94,8 @@
      */
     @GetMapping("/{id}")
     @Operation(summary = "璇︽儏")
-    public AjaxResult accountExpenseDetail(@PathVariable("id") Integer id) {
-        return AjaxResult.success(accountExpenseService.getById(id));
+    public R<?> accountExpenseDetail(@PathVariable("id") Integer id) {
+        return R.ok(accountExpenseService.getById(id));
     }
 
     /**
@@ -115,8 +116,8 @@
      */
     @GetMapping("/report/forms")
     @Operation(summary = "璐㈠姟鎶ヨ〃鍥捐〃鏌ヨ")
-    public AjaxResult report(DateQueryDto dateQueryDto) {
-        return AjaxResult.success(accountExpenseService.report(dateQueryDto));
+    public R<?> report(DateQueryDto dateQueryDto) {
+        return R.ok(accountExpenseService.report(dateQueryDto));
     }
 
     /**
@@ -125,8 +126,8 @@
      */
     @GetMapping("/report/analysis")
     @Operation(summary = "璐㈠姟鎶ヨ〃-璐㈠姟鍒嗘瀽")
-    public AjaxResult analysis() {
-        return AjaxResult.success(accountExpenseService.analysis());
+    public R<?> analysis() {
+        return R.ok(accountExpenseService.analysis());
     }
 
     /**
@@ -136,8 +137,8 @@
      */
     @GetMapping("/report/income")
     @Operation(summary = "璐㈠姟鎶ヨ〃鍥捐〃鏀跺叆骞村害鏌ヨ")
-    public AjaxResult reportIncome(ReportDateDto reportDateDto) {
-        return AjaxResult.success(accountIncomeService.reportIncome(reportDateDto));
+    public R<?> reportIncome(ReportDateDto reportDateDto) {
+        return R.ok(accountIncomeService.reportIncome(reportDateDto));
     }
 
     /**
@@ -147,8 +148,8 @@
      */
     @GetMapping("/report/expense")
     @Operation(summary = "璐㈠姟鎶ヨ〃鍥捐〃鏀嚭骞村害鏌ヨ")
-    public AjaxResult reportExpense(ReportDateDto reportDateDto) {
-        return AjaxResult.success(accountExpenseService.reportExpense(reportDateDto));
+    public R<?> reportExpense(ReportDateDto reportDateDto) {
+        return R.ok(accountExpenseService.reportExpense(reportDateDto));
     }
 
 
diff --git a/src/main/java/com/ruoyi/account/controller/AccountFileController.java b/src/main/java/com/ruoyi/account/controller/AccountFileController.java
index 42c20d1..4427a3f 100644
--- a/src/main/java/com/ruoyi/account/controller/AccountFileController.java
+++ b/src/main/java/com/ruoyi/account/controller/AccountFileController.java
@@ -3,9 +3,8 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.account.pojo.AccountFile;
 import com.ruoyi.account.service.AccountFileService;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.quality.pojo.QualityInspectFile;
-import com.ruoyi.quality.service.IQualityInspectFileService;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.util.CollectionUtils;
@@ -20,7 +19,7 @@
 @RestController
 @RequestMapping("/account/accountFile")
 @Tag(name = "璐㈠姟闄勪欢")
-public class AccountFileController {
+public class AccountFileController extends BaseController {
 
 
     @Resource
@@ -34,8 +33,8 @@
      */
     @PostMapping("/add")
     @Operation(summary = "鏂板")
-    public AjaxResult add(@RequestBody AccountFile accountFile) {
-        return AjaxResult.success(accountFileService.save(accountFile));
+    public R<?> add(@RequestBody AccountFile accountFile) {
+        return R.ok(accountFileService.save(accountFile));
     }
 
     /**
@@ -45,12 +44,12 @@
      */
     @DeleteMapping("/del")
     @Operation(summary = "鍒犻櫎")
-    public AjaxResult delAccountFile(@RequestBody List<Integer> ids) {
+    public R<?> delAccountFile(@RequestBody List<Integer> ids) {
         if(CollectionUtils.isEmpty(ids)){
-            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+            return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         }
         //鍒犻櫎妫�楠岄檮浠�
-        return AjaxResult.success(accountFileService.removeBatchByIds(ids));
+        return R.ok(accountFileService.removeBatchByIds(ids));
     }
 
     /**
@@ -61,8 +60,8 @@
      */
     @GetMapping("/listPage")
     @Operation(summary = "鍒嗛〉鏌ヨ")
-    public AjaxResult accountFileListPage(Page page, AccountFile accountFile) {
-        return AjaxResult.success(accountFileService.accountFileListPage(page, accountFile));
+    public R<?> accountFileListPage(Page page, AccountFile accountFile) {
+        return R.ok(accountFileService.accountFileListPage(page, accountFile));
     }
 
 
diff --git a/src/main/java/com/ruoyi/account/controller/AccountIncomeController.java b/src/main/java/com/ruoyi/account/controller/AccountIncomeController.java
index 690e75a..6d31342 100644
--- a/src/main/java/com/ruoyi/account/controller/AccountIncomeController.java
+++ b/src/main/java/com/ruoyi/account/controller/AccountIncomeController.java
@@ -1,19 +1,12 @@
 package com.ruoyi.account.controller;
 
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.account.pojo.AccountIncome;
-import com.ruoyi.account.service.AccountFileService;
 import com.ruoyi.account.service.AccountIncomeService;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.framework.security.LoginUser;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.quality.pojo.QualityInspect;
-import com.ruoyi.quality.pojo.QualityInspectFile;
-import com.ruoyi.quality.pojo.QualityInspectParam;
-import com.ruoyi.quality.service.IQualityInspectFileService;
-import com.ruoyi.quality.service.IQualityInspectParamService;
-import com.ruoyi.quality.service.IQualityInspectService;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.util.CollectionUtils;
@@ -30,7 +23,7 @@
 @RestController
 @RequestMapping("/account/accountIncome")
 @Tag(name = "璐㈠姟绠$悊--鏀跺叆绠$悊")
-public class AccountIncomeController {
+public class AccountIncomeController extends BaseController {
 
     @Resource
     private AccountIncomeService accountIncomeService;
@@ -43,11 +36,11 @@
      */
     @PostMapping("/add")
     @Operation(summary = "鏂板")
-    public AjaxResult add(@RequestBody AccountIncome accountIncome) {
+    public R<?> add(@RequestBody AccountIncome accountIncome) {
         accountIncome.setInputTime(new Date());
         LoginUser loginUser = SecurityUtils.getLoginUser();
         accountIncome.setInputUser(loginUser.getNickName());
-        return AjaxResult.success(accountIncomeService.save(accountIncome));
+        return R.ok(accountIncomeService.save(accountIncome));
     }
 
     /**
@@ -57,12 +50,12 @@
      */
     @DeleteMapping("/del")
     @Operation(summary = "鍒犻櫎")
-    public AjaxResult delQualityInspect(@RequestBody List<Integer> ids) {
+    public R<?> delQualityInspect(@RequestBody List<Integer> ids) {
         if(CollectionUtils.isEmpty(ids)){
-            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+            return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         }
         //鍒犻櫎妫�楠屽崟
-        return AjaxResult.success(accountIncomeService.removeBatchByIds(ids));
+        return R.ok(accountIncomeService.removeBatchByIds(ids));
     }
 
     /**
@@ -72,8 +65,8 @@
      */
     @PostMapping("/update")
     @Operation(summary = "淇敼")
-    public AjaxResult update(@RequestBody AccountIncome accountIncome) {
-        return AjaxResult.success(accountIncomeService.updateById(accountIncome));
+    public R<?> update(@RequestBody AccountIncome accountIncome) {
+        return R.ok(accountIncomeService.updateById(accountIncome));
     }
 
     /**
@@ -84,8 +77,8 @@
      */
     @GetMapping("/listPage")
     @Operation(summary = "鍒嗛〉鏌ヨ")
-    public AjaxResult accountIncomeListPage(Page page, AccountIncome accountIncome) {
-        return AjaxResult.success(accountIncomeService.accountIncomeListPage(page, accountIncome));
+    public R<?> accountIncomeListPage(Page page, AccountIncome accountIncome) {
+        return R.ok(accountIncomeService.accountIncomeListPage(page, accountIncome));
     }
 
     /**
@@ -95,8 +88,8 @@
      */
     @GetMapping("/{id}")
     @Operation(summary = "璇︽儏")
-    public AjaxResult accountIncomeDetail(@PathVariable("id") Integer id) {
-        return AjaxResult.success(accountIncomeService.getById(id));
+    public R<?> accountIncomeDetail(@PathVariable("id") Integer id) {
+        return R.ok(accountIncomeService.getById(id));
     }
 
     /**
diff --git a/src/main/java/com/ruoyi/account/controller/AccountingController.java b/src/main/java/com/ruoyi/account/controller/AccountingController.java
index 4688942..630694e 100644
--- a/src/main/java/com/ruoyi/account/controller/AccountingController.java
+++ b/src/main/java/com/ruoyi/account/controller/AccountingController.java
@@ -3,7 +3,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.account.service.impl.AccountingServiceImpl;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.AllArgsConstructor;
@@ -27,19 +27,19 @@
 
     @Operation(summary = "鎬昏")
     @GetMapping("/total")
-    public AjaxResult total(@RequestParam Integer year) {
+    public R<?> total(@RequestParam Integer year) {
         return accountingService.total(year);
     }
 
     @Operation(summary = "璁惧绫诲瀷鍒嗗竷")
     @GetMapping("/deviceTypeDistribution")
-    public AjaxResult deviceTypeDistribution(@RequestParam Integer year) {
+    public R<?> deviceTypeDistribution(@RequestParam Integer year) {
         return accountingService.deviceTypeDistribution(year);
     }
 
     @Operation(summary = "璁惧鍒嗛〉鏌ヨ璁$畻鎶樻棫")
     @GetMapping("/calculateDepreciation")
-    public AjaxResult calculateDepreciation(Page page, @RequestParam Integer year) {
+    public R<?> calculateDepreciation(Page page, @RequestParam Integer year) {
         return accountingService.calculateDepreciation(page,year);
     }
 
diff --git a/src/main/java/com/ruoyi/account/controller/BorrowInfoController.java b/src/main/java/com/ruoyi/account/controller/BorrowInfoController.java
index 7620c19..fd39de0 100644
--- a/src/main/java/com/ruoyi/account/controller/BorrowInfoController.java
+++ b/src/main/java/com/ruoyi/account/controller/BorrowInfoController.java
@@ -6,11 +6,11 @@
 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.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.AllArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
@@ -29,13 +29,13 @@
 @RestController
 @RequestMapping("/borrowInfo")
 @AllArgsConstructor
-public class BorrowInfoController {
+public class BorrowInfoController extends BaseController {
 
     private BorrowInfoService borrowInfoService;
 
     @GetMapping("/listPage")
     @Operation(summary = "鍒嗛〉鏌ヨ")
-    public AjaxResult listPage(Page page, BorrowInfo borrowInfo) {
+    public R<?> listPage(Page page, BorrowInfo borrowInfo) {
         return borrowInfoService.listPage(page,borrowInfo);
     }
 
@@ -45,7 +45,7 @@
     @PostMapping("/add")
     @Transactional(rollbackFor = Exception.class)
     @Log(title = "鏂板鍊熸淇℃伅", businessType = BusinessType.INSERT)
-    public AjaxResult add(@RequestBody BorrowInfo borrowInfo) {
+    public R<?> add(@RequestBody BorrowInfo borrowInfo) {
         return borrowInfoService.add(borrowInfo);
     }
 
@@ -55,7 +55,7 @@
     @PostMapping("/update")
     @Transactional(rollbackFor = Exception.class)
     @Log(title = "淇敼鍊熸淇℃伅", businessType = BusinessType.UPDATE)
-    public AjaxResult updateBorrowInfo(@RequestBody BorrowInfo borrowInfo) {
+    public R<?> updateBorrowInfo(@RequestBody BorrowInfo borrowInfo) {
         return borrowInfoService.updateBorrowInfo(borrowInfo);
     }
 
@@ -66,7 +66,7 @@
     @DeleteMapping("/delete")
     @Transactional(rollbackFor = Exception.class)
     @Log(title = "鍒犻櫎鍊熸淇℃伅", businessType = BusinessType.DELETE)
-    public AjaxResult delete(@RequestBody List<Long> ids) {
+    public R<?> delete(@RequestBody List<Long> ids) {
         return borrowInfoService.delete(ids);
     }
 
diff --git a/src/main/java/com/ruoyi/account/controller/AccountSubjectController.java b/src/main/java/com/ruoyi/account/controller/financial/AccountSubjectController.java
similarity index 91%
rename from src/main/java/com/ruoyi/account/controller/AccountSubjectController.java
rename to src/main/java/com/ruoyi/account/controller/financial/AccountSubjectController.java
index 38dd0ce..19d333d 100644
--- a/src/main/java/com/ruoyi/account/controller/AccountSubjectController.java
+++ b/src/main/java/com/ruoyi/account/controller/financial/AccountSubjectController.java
@@ -1,10 +1,10 @@
-package com.ruoyi.account.controller;
+package com.ruoyi.account.controller.financial;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.account.bean.dto.AccountSubjectDto;
-import com.ruoyi.account.bean.vo.AccountSubjectVo;
-import com.ruoyi.account.service.AccountSubjectService;
+import com.ruoyi.account.bean.dto.financial.AccountSubjectDto;
+import com.ruoyi.account.bean.vo.financial.AccountSubjectVo;
+import com.ruoyi.account.service.purchase.AccountSubjectService;
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
diff --git a/src/main/java/com/ruoyi/account/controller/AccounPurchaseController.java b/src/main/java/com/ruoyi/account/controller/purchase/AccounPurchaseController.java
similarity index 88%
rename from src/main/java/com/ruoyi/account/controller/AccounPurchaseController.java
rename to src/main/java/com/ruoyi/account/controller/purchase/AccounPurchaseController.java
index d1993ea..283e8fb 100644
--- a/src/main/java/com/ruoyi/account/controller/AccounPurchaseController.java
+++ b/src/main/java/com/ruoyi/account/controller/purchase/AccounPurchaseController.java
@@ -1,12 +1,12 @@
-package com.ruoyi.account.controller;
+package com.ruoyi.account.controller.purchase;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.account.bean.dto.PurchaseInboundDto;
-import com.ruoyi.account.bean.dto.PurchaseReturnDto;
-import com.ruoyi.account.bean.vo.PurchaseInboundVo;
-import com.ruoyi.account.bean.vo.PurchaseReturnVo;
-import com.ruoyi.account.service.AccountPurchaseService;
+import com.ruoyi.account.bean.dto.purchase.PurchaseInboundDto;
+import com.ruoyi.account.bean.dto.purchase.PurchaseReturnDto;
+import com.ruoyi.account.bean.vo.purchase.PurchaseInboundVo;
+import com.ruoyi.account.bean.vo.purchase.PurchaseReturnVo;
+import com.ruoyi.account.service.financial.AccountPurchaseService;
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
diff --git a/src/main/java/com/ruoyi/account/controller/AccountSalesController.java b/src/main/java/com/ruoyi/account/controller/sales/AccountSalesController.java
similarity index 88%
rename from src/main/java/com/ruoyi/account/controller/AccountSalesController.java
rename to src/main/java/com/ruoyi/account/controller/sales/AccountSalesController.java
index bca90db..25d8096 100644
--- a/src/main/java/com/ruoyi/account/controller/AccountSalesController.java
+++ b/src/main/java/com/ruoyi/account/controller/sales/AccountSalesController.java
@@ -1,12 +1,12 @@
-package com.ruoyi.account.controller;
+package com.ruoyi.account.controller.sales;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.account.bean.dto.SalesOutboundDto;
-import com.ruoyi.account.bean.dto.SalesReturnDto;
-import com.ruoyi.account.bean.vo.SalesOutboundVo;
-import com.ruoyi.account.bean.vo.SalesReturnVo;
-import com.ruoyi.account.service.AccountSalesService;
+import com.ruoyi.account.bean.dto.sales.SalesOutboundDto;
+import com.ruoyi.account.bean.dto.sales.SalesReturnDto;
+import com.ruoyi.account.bean.vo.sales.SalesOutboundVo;
+import com.ruoyi.account.bean.vo.sales.SalesReturnVo;
+import com.ruoyi.account.service.sales.AccountSalesService;
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
diff --git a/src/main/java/com/ruoyi/account/mapper/AccountSubjectMapper.java b/src/main/java/com/ruoyi/account/mapper/financial/AccountSubjectMapper.java
similarity index 82%
rename from src/main/java/com/ruoyi/account/mapper/AccountSubjectMapper.java
rename to src/main/java/com/ruoyi/account/mapper/financial/AccountSubjectMapper.java
index 46a4968..a5dd4fc 100644
--- a/src/main/java/com/ruoyi/account/mapper/AccountSubjectMapper.java
+++ b/src/main/java/com/ruoyi/account/mapper/financial/AccountSubjectMapper.java
@@ -1,7 +1,7 @@
-package com.ruoyi.account.mapper;
+package com.ruoyi.account.mapper.financial;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.ruoyi.account.pojo.AccountSubject;
+import com.ruoyi.account.pojo.financial.AccountSubject;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
diff --git a/src/main/java/com/ruoyi/account/pojo/AccountSubject.java b/src/main/java/com/ruoyi/account/pojo/financial/AccountSubject.java
similarity index 98%
rename from src/main/java/com/ruoyi/account/pojo/AccountSubject.java
rename to src/main/java/com/ruoyi/account/pojo/financial/AccountSubject.java
index 9616324..222ee6c 100644
--- a/src/main/java/com/ruoyi/account/pojo/AccountSubject.java
+++ b/src/main/java/com/ruoyi/account/pojo/financial/AccountSubject.java
@@ -1,4 +1,4 @@
-package com.ruoyi.account.pojo;
+package com.ruoyi.account.pojo.financial;
 
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.IdType;
diff --git a/src/main/java/com/ruoyi/account/service/BorrowInfoService.java b/src/main/java/com/ruoyi/account/service/BorrowInfoService.java
index eb1c83b..7d2384f 100644
--- a/src/main/java/com/ruoyi/account/service/BorrowInfoService.java
+++ b/src/main/java/com/ruoyi/account/service/BorrowInfoService.java
@@ -3,7 +3,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.account.pojo.BorrowInfo;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 
 import java.util.List;
 
@@ -17,11 +17,11 @@
  */
 public interface BorrowInfoService extends IService<BorrowInfo> {
 
-    AjaxResult listPage(Page page, BorrowInfo borrowInfo);
+    R<?> listPage(Page page, BorrowInfo borrowInfo);
 
-    AjaxResult add(BorrowInfo borrowInfo);
+    R<?> add(BorrowInfo borrowInfo);
 
-    AjaxResult updateBorrowInfo(BorrowInfo borrowInfo);
+    R<?> updateBorrowInfo(BorrowInfo borrowInfo);
 
-    AjaxResult delete(List<Long> ids);
+    R<?> delete(List<Long> ids);
 }
diff --git a/src/main/java/com/ruoyi/account/service/AccountPurchaseService.java b/src/main/java/com/ruoyi/account/service/financial/AccountPurchaseService.java
similarity index 72%
rename from src/main/java/com/ruoyi/account/service/AccountPurchaseService.java
rename to src/main/java/com/ruoyi/account/service/financial/AccountPurchaseService.java
index 386f921..b7a6cfd 100644
--- a/src/main/java/com/ruoyi/account/service/AccountPurchaseService.java
+++ b/src/main/java/com/ruoyi/account/service/financial/AccountPurchaseService.java
@@ -1,11 +1,11 @@
-package com.ruoyi.account.service;
+package com.ruoyi.account.service.financial;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.account.bean.dto.PurchaseInboundDto;
-import com.ruoyi.account.bean.dto.PurchaseReturnDto;
-import com.ruoyi.account.bean.vo.PurchaseInboundVo;
-import com.ruoyi.account.bean.vo.PurchaseReturnVo;
+import com.ruoyi.account.bean.dto.purchase.PurchaseInboundDto;
+import com.ruoyi.account.bean.dto.purchase.PurchaseReturnDto;
+import com.ruoyi.account.bean.vo.purchase.PurchaseInboundVo;
+import com.ruoyi.account.bean.vo.purchase.PurchaseReturnVo;
 import jakarta.servlet.http.HttpServletResponse;
 
 /**
diff --git a/src/main/java/com/ruoyi/account/service/impl/AccountingServiceImpl.java b/src/main/java/com/ruoyi/account/service/impl/AccountingServiceImpl.java
index ab38285..7df89e6 100644
--- a/src/main/java/com/ruoyi/account/service/impl/AccountingServiceImpl.java
+++ b/src/main/java/com/ruoyi/account/service/impl/AccountingServiceImpl.java
@@ -10,7 +10,7 @@
 import com.ruoyi.account.pojo.BorrowInfo;
 import com.ruoyi.device.mapper.DeviceLedgerMapper;
 import com.ruoyi.device.pojo.DeviceLedger;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.procurementrecord.mapper.CustomStorageMapper;
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
@@ -43,7 +43,7 @@
     private final ProcurementRecordMapper procurementRecordMapper;
     private final ProcurementRecordOutMapper procurementRecordOutMapper;
 
-    public AjaxResult total(Integer year) {
+    public R<?> total(Integer year) {
         Map<String,Object> map = new HashMap<>();
         map.put("deprAmount",0); // 鎶樻棫閲戦
         map.put("deviceTotal",0); // 璁惧鎬绘暟
@@ -150,7 +150,7 @@
             });
         }
         map.put("inventoryValue",procurementRecordTotal.add(customStorageTotal));
-        return AjaxResult.success( map);
+        return R.ok(map);
     }
 
     /**
@@ -245,7 +245,7 @@
         return totalDepreciation.setScale(2, BigDecimal.ROUND_HALF_UP);
     }
 
-    public AjaxResult deviceTypeDistribution(Integer year) {
+    public R<?> deviceTypeDistribution(Integer year) {
         // 2. 缁勮杩斿洖VO
        DeviceTypeDistributionVO vo = new DeviceTypeDistributionVO();
        List<DeviceTypeDetail> details = deviceLedgerMapper.getDeviceTypeDistributionByYear( year);
@@ -265,10 +265,10 @@
                    .collect(Collectors.toList()));
            vo.setTotalCount(vo.getCategories().size());
        }
-        return AjaxResult.success(vo);
+        return R.ok(vo);
     }
 
-    public AjaxResult calculateDepreciation(Page page, Integer year) {
+    public R<?> calculateDepreciation(Page page, Integer year) {
         LambdaQueryWrapper<DeviceLedger> deviceLedgerLambdaQueryWrapper = new LambdaQueryWrapper<>();
         deviceLedgerLambdaQueryWrapper.like(DeviceLedger::getCreateTime,year)
                 .eq(DeviceLedger::getIsDepr,1);
@@ -277,6 +277,6 @@
             record.setDeprAmount(calculatePreciseDepreciation(record));
             record.setNetValue(record.getTaxIncludingPriceTotal().subtract(record.getDeprAmount()));
         }
-        return AjaxResult.success(deviceLedgerIPage);
+        return R.ok(deviceLedgerIPage);
     }
 }
diff --git a/src/main/java/com/ruoyi/account/service/impl/BorrowInfoServiceImpl.java b/src/main/java/com/ruoyi/account/service/impl/BorrowInfoServiceImpl.java
index 773799d..950237f 100644
--- a/src/main/java/com/ruoyi/account/service/impl/BorrowInfoServiceImpl.java
+++ b/src/main/java/com/ruoyi/account/service/impl/BorrowInfoServiceImpl.java
@@ -12,7 +12,7 @@
 import com.ruoyi.account.service.BorrowInfoService;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -37,7 +37,7 @@
     private final AccountExpenseService accountExpenseService;
 
     @Override
-    public AjaxResult listPage(Page page, BorrowInfo borrowInfo) {
+    public R<?> listPage(Page page, BorrowInfo borrowInfo) {
         LambdaQueryWrapper<BorrowInfo> borrowInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
         if(borrowInfo != null){
             if(StringUtils.isNotEmpty(borrowInfo.getEntryDateStart()) && StringUtils.isNotEmpty(borrowInfo.getEntryDateEnd())){
@@ -51,11 +51,11 @@
                 borrowInfoLambdaQueryWrapper.like(BorrowInfo::getBorrowerName, borrowInfo.getBorrowerName());
             }
         }
-        return AjaxResult.success(borrowInfoMapper.selectPage(page, borrowInfoLambdaQueryWrapper));
+        return R.ok(borrowInfoMapper.selectPage(page, borrowInfoLambdaQueryWrapper));
     }
 
     @Override
-    public AjaxResult add(BorrowInfo borrowInfo) {
+    public R<?> add(BorrowInfo borrowInfo) {
         int insert = borrowInfoMapper.insert(borrowInfo);
         if(insert > 0){
             // 娣诲姞鎴愬姛锛岃繘鍏ユ敹鍏ョ鐞�
@@ -70,13 +70,13 @@
             accountIncome.setInputTime(DateUtils.getNowDate());
             accountIncome.setInputUser(borrowInfo.getBorrowerName());
             accountIncomeService.save(accountIncome);
-            return AjaxResult.success("娣诲姞鎴愬姛");
+            return R.ok(null, "娣诲姞鎴愬姛");
         }
-        return AjaxResult.success("娣诲姞澶辫触");
+        return R.ok(null, "娣诲姞澶辫触");
     }
 
     @Override
-    public AjaxResult updateBorrowInfo(BorrowInfo borrowInfo) {
+    public R<?> updateBorrowInfo(BorrowInfo borrowInfo) {
         int update = borrowInfoMapper.updateById(borrowInfo);
         if(update > 0){
             // 淇敼鎴愬姛锛屼慨鏀规敹鍏ョ鐞�
@@ -103,13 +103,13 @@
                 accountExpense.setInputUser(borrowInfo.getBorrowerName());
                 accountExpenseService.save(accountExpense);
             }
-            return AjaxResult.success("淇敼鎴愬姛");
+            return R.ok(null, "淇敼鎴愬姛");
         }
-        return  AjaxResult.success("淇敼澶辫触");
+        return R.ok(null, "淇敼澶辫触");
     }
 
     @Override
-    public AjaxResult delete(List<Long> ids) {
+    public R<?> delete(List<Long> ids) {
         int delete = borrowInfoMapper.deleteBatchIds(ids);
         if(delete > 0){
             // 鍒犻櫎鎴愬姛锛屽垹闄ゆ敹鍏ョ鐞�
@@ -120,8 +120,8 @@
             accountExpenseService.remove(new LambdaQueryWrapper<AccountExpense>()
                     .in(AccountExpense::getBusinessId, ids)
                     .eq(AccountExpense::getBusinessType, 2));
-            return AjaxResult.success("鍒犻櫎鎴愬姛");
+            return R.ok(null, "鍒犻櫎鎴愬姛");
         }
-        return  AjaxResult.success("鍒犻櫎澶辫触");
+        return R.ok(null, "鍒犻櫎澶辫触");
     }
 }
diff --git a/src/main/java/com/ruoyi/account/service/impl/AccountSubjectServiceImpl.java b/src/main/java/com/ruoyi/account/service/impl/financial/AccountSubjectServiceImpl.java
similarity index 97%
rename from src/main/java/com/ruoyi/account/service/impl/AccountSubjectServiceImpl.java
rename to src/main/java/com/ruoyi/account/service/impl/financial/AccountSubjectServiceImpl.java
index 37bf64b..a6c4149 100644
--- a/src/main/java/com/ruoyi/account/service/impl/AccountSubjectServiceImpl.java
+++ b/src/main/java/com/ruoyi/account/service/impl/financial/AccountSubjectServiceImpl.java
@@ -1,15 +1,15 @@
-package com.ruoyi.account.service.impl;
+package com.ruoyi.account.service.impl.financial;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.account.bean.dto.AccountSubjectDto;
-import com.ruoyi.account.bean.dto.AccountSubjectImportDto;
-import com.ruoyi.account.bean.vo.AccountSubjectVo;
-import com.ruoyi.account.mapper.AccountSubjectMapper;
-import com.ruoyi.account.pojo.AccountSubject;
-import com.ruoyi.account.service.AccountSubjectService;
+import com.ruoyi.account.bean.dto.financial.AccountSubjectDto;
+import com.ruoyi.account.bean.dto.financial.AccountSubjectImportDto;
+import com.ruoyi.account.bean.vo.financial.AccountSubjectVo;
+import com.ruoyi.account.mapper.financial.AccountSubjectMapper;
+import com.ruoyi.account.pojo.financial.AccountSubject;
+import com.ruoyi.account.service.purchase.AccountSubjectService;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
diff --git a/src/main/java/com/ruoyi/account/service/impl/financial/FinVoucherServiceImpl.java b/src/main/java/com/ruoyi/account/service/impl/financial/FinVoucherServiceImpl.java
index b7548ef..6859b52 100644
--- a/src/main/java/com/ruoyi/account/service/impl/financial/FinVoucherServiceImpl.java
+++ b/src/main/java/com/ruoyi/account/service/impl/financial/FinVoucherServiceImpl.java
@@ -8,10 +8,10 @@
 import com.ruoyi.account.bean.dto.financial.FinVoucherEntryDto;
 import com.ruoyi.account.bean.dto.financial.FinVoucherPageDto;
 import com.ruoyi.account.bean.vo.financial.FinVoucherDetailVo;
-import com.ruoyi.account.mapper.AccountSubjectMapper;
+import com.ruoyi.account.mapper.financial.AccountSubjectMapper;
 import com.ruoyi.account.mapper.financial.FinVoucherEntryMapper;
 import com.ruoyi.account.mapper.financial.FinVoucherMapper;
-import com.ruoyi.account.pojo.AccountSubject;
+import com.ruoyi.account.pojo.financial.AccountSubject;
 import com.ruoyi.account.pojo.financial.FinVoucher;
 import com.ruoyi.account.pojo.financial.FinVoucherEntry;
 import com.ruoyi.account.service.financial.FinVoucherService;
diff --git a/src/main/java/com/ruoyi/account/service/impl/AccountPurchaseServiceImpl.java b/src/main/java/com/ruoyi/account/service/impl/purchase/AccountPurchaseServiceImpl.java
similarity index 85%
rename from src/main/java/com/ruoyi/account/service/impl/AccountPurchaseServiceImpl.java
rename to src/main/java/com/ruoyi/account/service/impl/purchase/AccountPurchaseServiceImpl.java
index 747f6cf..9547d05 100644
--- a/src/main/java/com/ruoyi/account/service/impl/AccountPurchaseServiceImpl.java
+++ b/src/main/java/com/ruoyi/account/service/impl/purchase/AccountPurchaseServiceImpl.java
@@ -1,12 +1,12 @@
-package com.ruoyi.account.service.impl;
+package com.ruoyi.account.service.impl.purchase;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.account.bean.dto.PurchaseInboundDto;
-import com.ruoyi.account.bean.dto.PurchaseReturnDto;
-import com.ruoyi.account.bean.vo.PurchaseInboundVo;
-import com.ruoyi.account.bean.vo.PurchaseReturnVo;
-import com.ruoyi.account.service.AccountPurchaseService;
+import com.ruoyi.account.bean.dto.purchase.PurchaseInboundDto;
+import com.ruoyi.account.bean.dto.purchase.PurchaseReturnDto;
+import com.ruoyi.account.bean.vo.purchase.PurchaseInboundVo;
+import com.ruoyi.account.bean.vo.purchase.PurchaseReturnVo;
+import com.ruoyi.account.service.financial.AccountPurchaseService;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.purchase.mapper.PurchaseReturnOrdersMapper;
 import com.ruoyi.stock.mapper.StockInRecordMapper;
diff --git a/src/main/java/com/ruoyi/account/service/impl/AccountSalesServiceImpl.java b/src/main/java/com/ruoyi/account/service/impl/sales/AccountSalesServiceImpl.java
similarity index 85%
rename from src/main/java/com/ruoyi/account/service/impl/AccountSalesServiceImpl.java
rename to src/main/java/com/ruoyi/account/service/impl/sales/AccountSalesServiceImpl.java
index ddf4a57..814d294 100644
--- a/src/main/java/com/ruoyi/account/service/impl/AccountSalesServiceImpl.java
+++ b/src/main/java/com/ruoyi/account/service/impl/sales/AccountSalesServiceImpl.java
@@ -1,12 +1,12 @@
-package com.ruoyi.account.service.impl;
+package com.ruoyi.account.service.impl.sales;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.account.bean.dto.SalesOutboundDto;
-import com.ruoyi.account.bean.dto.SalesReturnDto;
-import com.ruoyi.account.bean.vo.SalesOutboundVo;
-import com.ruoyi.account.bean.vo.SalesReturnVo;
-import com.ruoyi.account.service.AccountSalesService;
+import com.ruoyi.account.bean.dto.sales.SalesOutboundDto;
+import com.ruoyi.account.bean.dto.sales.SalesReturnDto;
+import com.ruoyi.account.bean.vo.sales.SalesOutboundVo;
+import com.ruoyi.account.bean.vo.sales.SalesReturnVo;
+import com.ruoyi.account.service.sales.AccountSalesService;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.procurementrecord.mapper.ReturnManagementMapper;
 import com.ruoyi.stock.mapper.StockOutRecordMapper;
diff --git a/src/main/java/com/ruoyi/account/service/AccountSubjectService.java b/src/main/java/com/ruoyi/account/service/purchase/AccountSubjectService.java
similarity index 78%
rename from src/main/java/com/ruoyi/account/service/AccountSubjectService.java
rename to src/main/java/com/ruoyi/account/service/purchase/AccountSubjectService.java
index bcbc57c..51d44ec 100644
--- a/src/main/java/com/ruoyi/account/service/AccountSubjectService.java
+++ b/src/main/java/com/ruoyi/account/service/purchase/AccountSubjectService.java
@@ -1,10 +1,10 @@
-package com.ruoyi.account.service;
+package com.ruoyi.account.service.purchase;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.account.bean.dto.AccountSubjectDto;
-import com.ruoyi.account.bean.vo.AccountSubjectVo;
-import com.ruoyi.account.pojo.AccountSubject;
+import com.ruoyi.account.bean.dto.financial.AccountSubjectDto;
+import com.ruoyi.account.bean.vo.financial.AccountSubjectVo;
+import com.ruoyi.account.pojo.financial.AccountSubject;
 import com.baomidou.mybatisplus.extension.service.IService;
 import jakarta.servlet.http.HttpServletResponse;
 
diff --git a/src/main/java/com/ruoyi/account/service/AccountSalesService.java b/src/main/java/com/ruoyi/account/service/sales/AccountSalesService.java
similarity index 73%
rename from src/main/java/com/ruoyi/account/service/AccountSalesService.java
rename to src/main/java/com/ruoyi/account/service/sales/AccountSalesService.java
index 7db5416..82f606c 100644
--- a/src/main/java/com/ruoyi/account/service/AccountSalesService.java
+++ b/src/main/java/com/ruoyi/account/service/sales/AccountSalesService.java
@@ -1,11 +1,11 @@
-package com.ruoyi.account.service;
+package com.ruoyi.account.service.sales;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.account.bean.dto.SalesOutboundDto;
-import com.ruoyi.account.bean.dto.SalesReturnDto;
-import com.ruoyi.account.bean.vo.SalesOutboundVo;
-import com.ruoyi.account.bean.vo.SalesReturnVo;
+import com.ruoyi.account.bean.dto.sales.SalesOutboundDto;
+import com.ruoyi.account.bean.dto.sales.SalesReturnDto;
+import com.ruoyi.account.bean.vo.sales.SalesOutboundVo;
+import com.ruoyi.account.bean.vo.sales.SalesReturnVo;
 import jakarta.servlet.http.HttpServletResponse;
 
 /**
diff --git a/src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesNearExpiryController.java b/src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesNearExpiryController.java
index ccc13b9..1bb2125 100644
--- a/src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesNearExpiryController.java
+++ b/src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesNearExpiryController.java
@@ -7,7 +7,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.AllArgsConstructor;
@@ -36,9 +36,9 @@
     @PostMapping("/add")
     @Operation(summary = "鏂板涓存湡鍞悗")
     @Log(title = "鏂板涓存湡鍞悗", businessType = BusinessType.INSERT)
-    public AjaxResult add(@RequestBody AfterSalesNearExpiry entity) {
+    public R<?> add(@RequestBody AfterSalesNearExpiry entity) {
         afterSalesNearExpiryService.add(entity);
-        return AjaxResult.success("娣诲姞鎴愬姛");
+        return R.ok(null, "娣诲姞鎴愬姛");
     }
 
     /**
@@ -47,9 +47,9 @@
     @PostMapping("/update")
     @Operation(summary = "鏇存柊涓存湡鍞悗")
     @Log(title = "鏇存柊涓存湡鍞悗", businessType = BusinessType.UPDATE)
-    public AjaxResult update(@RequestBody AfterSalesNearExpiry entity) {
+    public R<?> update(@RequestBody AfterSalesNearExpiry entity) {
         afterSalesNearExpiryService.update(entity);
-        return AjaxResult.success("鏇存柊鎴愬姛");
+        return R.ok(null, "鏇存柊鎴愬姛");
     }
 
     /**
@@ -58,9 +58,9 @@
     @DeleteMapping("/delete")
     @Operation(summary = "鍒犻櫎涓存湡鍞悗")
     @Log(title = "鍒犻櫎涓存湡鍞悗", businessType = BusinessType.DELETE)
-    public AjaxResult delete(Long[] ids) {
+    public R<?> delete(Long[] ids) {
         afterSalesNearExpiryService.delete(ids);
-        return AjaxResult.success("鍒犻櫎鎴愬姛");
+        return R.ok(null, "鍒犻櫎鎴愬姛");
     }
 
     /**
@@ -69,9 +69,9 @@
     @GetMapping("/listPage")
     @Operation(summary = "鍒嗛〉鏌ヨ涓存湡鍞悗")
     @Log(title = "鍒嗛〉鏌ヨ涓存湡鍞悗", businessType = BusinessType.OTHER)
-    public AjaxResult listPage(Page<AfterSalesNearExpiry> page, AfterSalesNearExpiry entity) {
+    public R<?> listPage(Page<AfterSalesNearExpiry> page, AfterSalesNearExpiry entity) {
         IPage<AfterSalesNearExpiry> listPage = afterSalesNearExpiryService.listPage(page, entity);
-        return AjaxResult.success(listPage);
+        return R.ok(listPage);
     }
 
 }
diff --git a/src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesServiceController.java b/src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesServiceController.java
index 5f4c3a8..0c424fb 100644
--- a/src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesServiceController.java
+++ b/src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesServiceController.java
@@ -10,7 +10,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.mapper.SysUserMapper;
 import com.ruoyi.sales.dto.SalesLedgerDto;
@@ -45,9 +45,9 @@
     @GetMapping("/listPage")
     @Operation(summary = "鍞悗鏈嶅姟-鍒嗛〉鏌ヨ")
     @Log(title = "鍞悗鏈嶅姟-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
-    public AjaxResult listPage(Page page, AfterSalesServiceNewDto afterSalesService) {
+    public R<?> listPage(Page page, AfterSalesServiceNewDto afterSalesService) {
         IPage<AfterSalesServiceNewDto> listPage = afterSalesServiceService.listPage(page, afterSalesService);
-        return AjaxResult.success(listPage);
+        return R.ok(listPage);
     }
 
     @Log(title = "鍞悗鏈嶅姟-鍙嶉鐧昏", businessType = BusinessType.EXPORT)
@@ -85,14 +85,14 @@
     @PostMapping("/add")
     @Operation(summary = "鍞悗鏈嶅姟-鏂板")
     @Log(title = "鍞悗鏈嶅姟-鏂板", businessType = BusinessType.INSERT)
-    public AjaxResult add(@RequestBody AfterSalesServiceNewDto afterSalesServiceNewDto) {
-        return afterSalesServiceService.addAfterSalesServiceDto(afterSalesServiceNewDto) ? AjaxResult.success() : AjaxResult.error();
+    public R<?> add(@RequestBody AfterSalesServiceNewDto afterSalesServiceNewDto) {
+        return afterSalesServiceService.addAfterSalesServiceDto(afterSalesServiceNewDto) ? R.ok() : R.fail();
     }
 
     @PostMapping("/update")
     @Operation(summary = "鍞悗鏈嶅姟-淇敼")
     @Log(title = "鍞悗鏈嶅姟-淇敼", businessType = BusinessType.UPDATE)
-    public AjaxResult update(@RequestBody AfterSalesServiceNewDto afterSalesServiceNewDto) {
+    public R<?> update(@RequestBody AfterSalesServiceNewDto afterSalesServiceNewDto) {
         if (afterSalesServiceNewDto.getProductModelIdList() != null && afterSalesServiceNewDto.getProductModelIdList().isEmpty() ) {
             String productModelIds = afterSalesServiceNewDto.getProductModelIdList().stream()
                     .map(String::valueOf)
@@ -100,24 +100,24 @@
             afterSalesServiceNewDto.setProductModelIds(productModelIds);
         }
         boolean update = afterSalesServiceService.updateById(afterSalesServiceNewDto);
-        return update ? AjaxResult.success() : AjaxResult.error();
+        return update ? R.ok() : R.fail();
     }
 
     @DeleteMapping("/delete")
     @Operation(summary = "鍞悗鏈嶅姟-鍒犻櫎")
     @Log(title = "鍞悗鏈嶅姟-鍒犻櫎", businessType = BusinessType.DELETE)
-    public AjaxResult delete(@RequestBody List<Long> ids) {
+    public R<?> delete(@RequestBody List<Long> ids) {
         if (CollectionUtils.isEmpty(ids)) {
-            return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+            return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
         }
         boolean delete = afterSalesServiceService.removeByIds(ids);
-        return delete ? AjaxResult.success() : AjaxResult.error();
+        return delete ? R.ok() : R.fail();
     }
 
     @PostMapping("/dispose")
     @Operation(summary = "鍞悗鏈嶅姟-澶勭悊")
     @Log(title = "鍞悗鏈嶅姟-澶勭悊", businessType = BusinessType.UPDATE)
-    public AjaxResult dispose(@RequestBody AfterSalesService afterSalesService) {
+    public R<?> dispose(@RequestBody AfterSalesService afterSalesService) {
         AfterSalesService byId = afterSalesServiceService.getById(afterSalesService.getId());
         if(byId == null) throw new RuntimeException("鏈壘鍒拌鏁版嵁");
         if(byId.getStatus().equals(2)) throw new RuntimeException("璇ユ暟鎹凡澶勭悊");
@@ -126,28 +126,28 @@
         afterSalesService.setDisposeNickName(sysUser.getNickName());
         afterSalesService.setStatus(2);
         boolean update = afterSalesServiceService.updateById(afterSalesService);
-        return update ? AjaxResult.success() : AjaxResult.error();
+        return update ? R.ok() : R.fail();
     }
 
 
     @GetMapping("listSalesLedger")
     @Operation(summary = "鍞悗鏈嶅姟-鑾峰彇閿�鍞彴璐�")
-    public AjaxResult listSalesLedger(SalesLedgerDto salesLedgerDto, Page page) {
+    public R<?> listSalesLedger(SalesLedgerDto salesLedgerDto, Page page) {
         IPage<SalesLedgerDto> list = salesLedgerService.listSalesLedger(salesLedgerDto,page);
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
 
 
     @GetMapping("getById")
     @Operation(summary = "鍞悗鏈嶅姟-鏍规嵁id鑾峰彇璇︽儏")
-    public AjaxResult getById(Long id) {
-        return AjaxResult.success(afterSalesServiceService.getAfterSalesServiceNewDtoById(id));
+    public R<?> getById(Long id) {
+        return R.ok(afterSalesServiceService.getAfterSalesServiceNewDtoById(id));
     }
 
     @Operation(summary = "鍞悗鏈嶅姟-缁熻宸ュ崟鎯呭喌")
     @GetMapping("count")
-    public AjaxResult count() {
-        return AjaxResult.success(afterSalesServiceService.countAfterSalesService());
+    public R<?> count() {
+        return R.ok(afterSalesServiceService.countAfterSalesService());
     }
 
 }
diff --git a/src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesServiceFileController.java b/src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesServiceFileController.java
index 9032852..2290e5b 100644
--- a/src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesServiceFileController.java
+++ b/src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesServiceFileController.java
@@ -6,7 +6,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.AllArgsConstructor;
@@ -34,24 +34,24 @@
     @PostMapping("/upload")
     @Operation(summary = "鍞悗鏈嶅姟-鏂囦欢涓婁紶")
     @Log(title = "鍞悗鏈嶅姟-鏂囦欢涓婁紶", businessType = BusinessType.INSERT)
-    public AjaxResult fileUpload(@RequestParam("file") MultipartFile file,
+    public R<?> fileUpload(@RequestParam("file") MultipartFile file,
                                  @RequestParam("id") Long afterSalesServiceId) {
         afterSalesServiceFileService.fileUpload(file, afterSalesServiceId);
-        return AjaxResult.success("涓婁紶鎴愬姛");
+        return R.ok(null, "涓婁紶鎴愬姛");
     }
 
     @GetMapping("/listPage")
     @Operation(summary = "鍞悗澶勭悊-鍞悗闄勪欢鍒楄〃")
     @Log(title = "鍞悗澶勭悊-鍞悗闄勪欢鍒楄〃", businessType = BusinessType.OTHER)
-    public AjaxResult fileList(Page<AfterSalesServiceFile> page, Long afterSalesServiceId) {
-        return AjaxResult.success(afterSalesServiceFileService.fileList(page, afterSalesServiceId));
+    public R<?> fileList(Page<AfterSalesServiceFile> page, Long afterSalesServiceId) {
+        return R.ok(afterSalesServiceFileService.fileList(page, afterSalesServiceId));
     }
 
     @DeleteMapping("/del/{fileId}")
     @Operation(summary = "鍞悗澶勭悊-鍒犻櫎闄勪欢")
     @Log(title = "鍞悗澶勭悊-鍒犻櫎闄勪欢", businessType = BusinessType.DELETE)
-    public AjaxResult delFile(@PathVariable Long fileId) {
+    public R<?> delFile(@PathVariable Long fileId) {
         afterSalesServiceFileService.delFile(fileId);
-        return AjaxResult.success("鍒犻櫎鎴愬姛!");
+        return R.ok(null, "鍒犻櫎鎴愬姛!");
     }
 }
diff --git a/src/main/java/com/ruoyi/ai/assistant/ApproveTodoAgent.java b/src/main/java/com/ruoyi/ai/assistant/ApproveTodoAgent.java
index 3b37909..bad0e0a 100644
--- a/src/main/java/com/ruoyi/ai/assistant/ApproveTodoAgent.java
+++ b/src/main/java/com/ruoyi/ai/assistant/ApproveTodoAgent.java
@@ -3,6 +3,7 @@
 import dev.langchain4j.service.MemoryId;
 import dev.langchain4j.service.SystemMessage;
 import dev.langchain4j.service.UserMessage;
+import dev.langchain4j.service.V;
 import dev.langchain4j.service.spring.AiService;
 import reactor.core.publisher.Flux;
 
@@ -16,5 +17,5 @@
 public interface ApproveTodoAgent {
 
     @SystemMessage(fromResource = "approve-todo-agent-prompt.txt")
-    Flux<String> chat(@MemoryId String memoryId, @UserMessage String userMessage);
+    Flux<String> chat(@MemoryId String memoryId, @UserMessage String userMessage, @V("currentDate") String currentDate);
 }
diff --git a/src/main/java/com/ruoyi/ai/assistant/ApproveTodoIntentExecutor.java b/src/main/java/com/ruoyi/ai/assistant/ApproveTodoIntentExecutor.java
index 9f8499d..8d8ad45 100644
--- a/src/main/java/com/ruoyi/ai/assistant/ApproveTodoIntentExecutor.java
+++ b/src/main/java/com/ruoyi/ai/assistant/ApproveTodoIntentExecutor.java
@@ -14,8 +14,9 @@
 @Component
 public class ApproveTodoIntentExecutor {
 
-    private static final Pattern APPROVE_ID_PATTERN = Pattern.compile("\\b[A-Za-z]*\\d{8,}\\b");
-    private static final Pattern LIMIT_PATTERN = Pattern.compile("(鍓峾鏈�杩�)?(\\d{1,2})鏉�");
+    private static final Pattern APPROVE_ID_BY_LABEL_PATTERN = Pattern.compile("(娴佺▼缂栧彿|娴佺▼鍙穦娴佺▼ID|瀹℃壒缂栧彿|缂栧彿)\\s*[:锛歖?\\s*([A-Za-z0-9_-]{2,64})");
+    private static final Pattern APPROVE_ID_PATTERN = Pattern.compile("\\b[A-Za-z]*\\d{6,}[A-Za-z0-9_-]*\\b");
+    private static final Pattern LIMIT_PATTERN = Pattern.compile("(鍓峾鏈�杩�)?\\s*(\\d{1,2})\\s*鏉�");
     private static final Pattern DATE_PATTERN = Pattern.compile("(\\d{4}-\\d{2}-\\d{2})");
     private static final Pattern NUMBER_PATTERN = Pattern.compile("(\\d+(?:\\.\\d+)?)");
     private static final Pattern RECENT_RANGE_PATTERN = Pattern.compile("杩慭\d+(澶﹟鍛▅涓湀|鏈坾骞�)");
@@ -34,54 +35,63 @@
         }
 
         String text = message.trim();
+        String quickPromptResponse = tryExecuteQuickPrompt(memoryId, text);
+        if (StringUtils.hasText(quickPromptResponse)) {
+            return quickPromptResponse;
+        }
+
         String approveId = extractApproveId(text);
+        boolean hasApproveId = StringUtils.hasText(approveId) && !isPlaceholderApproveId(approveId);
+        String startDate = extractStartDate(text);
+        String endDate = extractEndDate(text);
+        String timeRange = extractTimeRange(text);
 
         if (isStatsIntent(text)) {
             return approveTodoTools.getTodoStats(
                     memoryId,
-                    extractStartDate(text),
-                    extractEndDate(text),
-                    extractTimeRange(text)
+                    startDate,
+                    endDate,
+                    timeRange
             );
         }
         if (containsAny(text, "娴佽浆", "杩涘害", "鑺傜偣", "鏃ュ織", "鍗″湪", "鍗″埌", "褰撳墠瀹℃壒浜�", "澶勭悊璁板綍")) {
-            return StringUtils.hasText(approveId)
+            return hasApproveId
                     ? approveTodoTools.getTodoProgress(memoryId, approveId)
                     : missingApproveId("todo_progress", "鏌ヨ瀹℃壒杩涘害闇�瑕佹彁渚涙祦绋嬬紪鍙枫��");
         }
         if (containsAny(text, "璇︽儏", "鏄庣粏") && !containsAny(text, "鍒楄〃")) {
-            return StringUtils.hasText(approveId)
+            return hasApproveId
                     ? approveTodoTools.getTodoDetail(memoryId, approveId)
                     : missingApproveId("todo_detail", "鏌ヨ瀹℃壒璇︽儏闇�瑕佹彁渚涙祦绋嬬紪鍙枫��");
         }
         if (containsAny(text, "鍙栨秷瀹℃牳", "鎾ら攢瀹℃牳", "鍥為��瀹℃牳", "鎾ら攢瀹℃壒", "鎾ゅ洖瀹℃壒")
                 || (containsAny(text, "鎾ら攢", "鎾ゅ洖") && containsAny(text, "瀹℃壒鎿嶄綔", "瀹℃牳鎿嶄綔"))) {
-            return StringUtils.hasText(approveId)
-                    ? approveTodoTools.cancelReviewTodo(memoryId, approveId, firstNonBlank(extractTail(text, "鍘熷洜"), extractTail(text, "澶囨敞")))
+            return hasApproveId
+                    ? approveTodoTools.cancelReviewTodo(memoryId, approveId, extractRemark(text))
                     : missingApproveId("cancel_review_action", "鍙栨秷瀹℃牳闇�瑕佹彁渚涙祦绋嬬紪鍙枫��");
         }
         if (containsAny(text, "鍒犻櫎", "绉婚櫎")) {
-            return StringUtils.hasText(approveId)
+            return hasApproveId
                     ? approveTodoTools.deleteTodo(memoryId, approveId)
                     : missingApproveId("delete_action", "鍒犻櫎瀹℃壒鍗曢渶瑕佹彁渚涙祦绋嬬紪鍙枫��");
         }
         if (containsAny(text, "椹冲洖", "鎷掔粷")) {
-            return StringUtils.hasText(approveId)
-                    ? approveTodoTools.reviewTodo(memoryId, approveId, "reject", firstNonBlank(extractTail(text, "鍘熷洜"), extractTail(text, "澶囨敞")))
+            return hasApproveId
+                    ? approveTodoTools.reviewTodo(memoryId, approveId, "reject", extractRemark(text))
                     : missingApproveId("review_action", "椹冲洖瀹℃壒闇�瑕佹彁渚涙祦绋嬬紪鍙枫��");
         }
         if (containsAny(text, "瀹℃牳閫氳繃", "瀹℃壒閫氳繃", "閫氳繃瀹℃壒", "鍚屾剰瀹℃壒", "瀹℃壒鍚屾剰")) {
-            return StringUtils.hasText(approveId)
-                    ? approveTodoTools.reviewTodo(memoryId, approveId, "approve", extractTail(text, "澶囨敞"))
+            return hasApproveId
+                    ? approveTodoTools.reviewTodo(memoryId, approveId, "approve", extractRemark(text))
                     : missingApproveId("review_action", "瀹℃壒閫氳繃闇�瑕佹彁渚涙祦绋嬬紪鍙枫��");
         }
-        if (StringUtils.hasText(approveId)
+        if (hasApproveId
                 && containsAny(text, "閫氳繃", "鍚屾剰")
                 && !containsAny(text, "鏈�氳繃", "閫氳繃鐜�", "瀹℃壒閫氳繃鐜�", "瀹℃牳閫氳繃鐜�")) {
-            return approveTodoTools.reviewTodo(memoryId, approveId, "approve", extractTail(text, "澶囨敞"));
+            return approveTodoTools.reviewTodo(memoryId, approveId, "approve", extractRemark(text));
         }
         if (containsAny(text, "淇敼", "鏇存柊", "鍙樻洿")) {
-            return StringUtils.hasText(approveId)
+            return hasApproveId
                     ? approveTodoTools.updateTodo(
                     memoryId,
                     approveId,
@@ -101,7 +111,82 @@
                     extractApproveType(text),
                     extractKeyword(text),
                     extractLimit(text),
-                    extractScope(text));
+                    extractScope(text),
+                    startDate,
+                    endDate,
+                    timeRange);
+        }
+        return null;
+    }
+
+    private String tryExecuteQuickPrompt(String memoryId, String text) {
+        String normalized = normalizeForMatch(text);
+        String approveId = extractApproveId(text);
+        boolean hasApproveId = StringUtils.hasText(approveId) && !isPlaceholderApproveId(approveId);
+
+        if ("鎴戝綋鍓嶆湁鍝簺瀹℃壒寰呭姙闇�瑕佸鐞�".equals(normalized)) {
+            return approveTodoTools.listTodos(memoryId, "pending", null, null, 10, "approver", null, null, null);
+        }
+        if ("甯垜鍒楀嚭浠婂ぉ鏂板鐨勫鎵瑰緟鍔�".equals(normalized)) {
+            return approveTodoTools.listTodos(memoryId, "all", null, null, 10, "related", null, null, "浠婂ぉ");
+        }
+        if ("褰撳墠寰呮垜瀹℃壒鐨勫崟鎹寜鏃堕棿鍊掑簭鍒楀嚭鏉�".equals(normalized)) {
+            return approveTodoTools.listTodos(memoryId, "pending", null, null, 10, "approver", null, null, null);
+        }
+        if ("鎴戝彂璧风殑瀹℃壒閲屽摢浜涜繕鍦ㄥ鐞嗕腑".equals(normalized)) {
+            return approveTodoTools.listTodos(memoryId, "processing", null, null, 10, "applicant", null, null, null);
+        }
+        if ("杩�7澶╂垜鐨勫鎵瑰緟鍔炵粺璁℃儏鍐垫�庝箞鏍�".equals(normalized)) {
+            return approveTodoTools.getTodoStats(memoryId, null, null, "杩�7澶�");
+        }
+        if ("鏈湀鎴戠殑瀹℃壒涓�氳繃椹冲洖澶勭悊涓悇鏈夊灏�".equals(normalized)) {
+            return approveTodoTools.getTodoStats(memoryId, null, null, "鏈湀");
+        }
+        if ("杩�30澶╁悇绫诲瀷瀹℃壒鏁伴噺鍒嗗竷鏄粈涔�".equals(normalized)) {
+            return approveTodoTools.getTodoStats(memoryId, null, null, "杩�30澶�");
+        }
+
+        if (normalized.startsWith("鏌ヨ娴佺▼缂栧彿") && normalized.contains("瀹℃壒璇︽儏")) {
+            return hasApproveId
+                    ? approveTodoTools.getTodoDetail(memoryId, approveId)
+                    : missingApproveId("todo_detail", "鏌ヨ瀹℃壒璇︽儏闇�瑕佹彁渚涚湡瀹炴祦绋嬬紪鍙枫��");
+        }
+        if (normalized.startsWith("娴佺▼缂栧彿")
+                && normalized.contains("鍗″湪鍝釜瀹℃壒鑺傜偣")
+                && normalized.contains("褰撳墠瀹℃壒浜烘槸璋�")) {
+            return hasApproveId
+                    ? approveTodoTools.getTodoProgress(memoryId, approveId)
+                    : missingApproveId("todo_progress", "鏌ヨ瀹℃壒杩涘害闇�瑕佹彁渚涚湡瀹炴祦绋嬬紪鍙枫��");
+        }
+        if (normalized.startsWith("甯垜鏌ョ湅娴佺▼缂栧彿") && normalized.contains("瀹℃壒娴佽浆璁板綍")) {
+            return hasApproveId
+                    ? approveTodoTools.getTodoProgress(memoryId, approveId)
+                    : missingApproveId("todo_progress", "鏌ヨ瀹℃壒娴佽浆璁板綍闇�瑕佹彁渚涚湡瀹炴祦绋嬬紪鍙枫��");
+        }
+        if (normalized.startsWith("甯垜瀹℃壒閫氳繃娴佺▼缂栧彿")) {
+            return hasApproveId
+                    ? approveTodoTools.reviewTodo(memoryId, approveId, "approve", extractRemark(text))
+                    : missingApproveId("review_action", "瀹℃壒閫氳繃闇�瑕佹彁渚涚湡瀹炴祦绋嬬紪鍙枫��");
+        }
+        if (normalized.startsWith("甯垜椹冲洖娴佺▼缂栧彿")) {
+            return hasApproveId
+                    ? approveTodoTools.reviewTodo(memoryId, approveId, "reject", extractRemark(text))
+                    : missingApproveId("review_action", "椹冲洖瀹℃壒闇�瑕佹彁渚涚湡瀹炴祦绋嬬紪鍙枫��");
+        }
+        if (normalized.startsWith("鎾ら攢鎴戝垰鍒氬娴佺▼缂栧彿") && normalized.contains("瀹℃壒鎿嶄綔")) {
+            return hasApproveId
+                    ? approveTodoTools.cancelReviewTodo(memoryId, approveId, extractRemark(text))
+                    : missingApproveId("cancel_review_action", "鎾ら攢瀹℃壒鎿嶄綔闇�瑕佹彁渚涚湡瀹炴祦绋嬬紪鍙枫��");
+        }
+        if (normalized.startsWith("甯垜淇敼娴佺▼缂栧彿") && normalized.contains("澶囨敞涓�")) {
+            return hasApproveId
+                    ? approveTodoTools.updateTodo(memoryId, approveId, null, null, null, null, null, null, extractRemark(text))
+                    : missingApproveId("update_action", "淇敼瀹℃壒鍗曢渶瑕佹彁渚涚湡瀹炴祦绋嬬紪鍙枫��");
+        }
+        if (normalized.startsWith("鍒犻櫎鎴戝彂璧风殑娴佺▼缂栧彿")) {
+            return hasApproveId
+                    ? approveTodoTools.deleteTodo(memoryId, approveId)
+                    : missingApproveId("delete_action", "鍒犻櫎瀹℃壒鍗曢渶瑕佹彁渚涚湡瀹炴祦绋嬬紪鍙枫��");
         }
         return null;
     }
@@ -130,6 +215,10 @@
     }
 
     private String extractApproveId(String text) {
+        Matcher keywordMatcher = APPROVE_ID_BY_LABEL_PATTERN.matcher(text);
+        if (keywordMatcher.find()) {
+            return keywordMatcher.group(2);
+        }
         Matcher matcher = APPROVE_ID_PATTERN.matcher(text);
         return matcher.find() ? matcher.group() : null;
     }
@@ -196,6 +285,8 @@
                 .replace("鍗曟嵁", "")
                 .replace("寰呭姙", "")
                 .replace("鍒楄〃", "")
+                .replace("娴佺▼缂栧彿", "")
+                .replace("娴佺▼鍙�", "")
                 .replace("鍓�10鏉�", "")
                 .replace("鏈�杩�10鏉�", "")
                 .trim();
@@ -203,7 +294,7 @@
     }
 
     private String extractValue(String text, String fieldName) {
-        Pattern pattern = Pattern.compile(fieldName + "(鏀逛负|淇敼涓簗鏄�)[:锛歖?[\\s]*([^,锛屻�傦紱;\\s]+)");
+        Pattern pattern = Pattern.compile(fieldName + "(鏀逛负|淇敼涓簗涓簗鏄�)[:锛歖?[\\s]*([^,锛屻�傦紱;\\s]+)");
         Matcher matcher = pattern.matcher(text);
         return matcher.find() ? matcher.group(2) : null;
     }
@@ -250,7 +341,7 @@
         if (!text.contains(fieldName)) {
             return null;
         }
-        Matcher matcher = Pattern.compile(fieldName + "(鏀逛负|淇敼涓簗鏄�)[:锛歖?[\\s]*(\\d{1,2})").matcher(text);
+        Matcher matcher = Pattern.compile(fieldName + "(鏀逛负|淇敼涓簗涓簗鏄�)[:锛歖?[\\s]*(\\d{1,2})").matcher(text);
         return matcher.find() ? Integer.parseInt(matcher.group(2)) : null;
     }
 
@@ -264,21 +355,85 @@
     }
 
     private String extractTail(String text, String key) {
+        Pattern quotedPattern = Pattern.compile(key + "(鏄瘄涓�)?[:锛歖?[\\s]*[鈥淺"]([^鈥漒"]+)[鈥漒"]");
+        Matcher quotedMatcher = quotedPattern.matcher(text);
+        if (quotedMatcher.find()) {
+            return cleanContent(quotedMatcher.group(2));
+        }
         Pattern pattern = Pattern.compile(key + "(鏄瘄涓�)?[:锛歖?[\\s]*(.+)");
         Matcher matcher = pattern.matcher(text);
-        return matcher.find() ? matcher.group(2).trim() : null;
+        return matcher.find() ? cleanContent(matcher.group(2)) : null;
     }
 
     private String extractScope(String text) {
         if (containsAny(text, "鎴戝彂璧�", "鎴戞彁浜�", "鎴戠敵璇�", "鐢宠浜烘槸鎴�")) {
             return "applicant";
         }
-        if (containsAny(text, "寰呮垜瀹℃壒", "寰呮垜瀹℃牳", "鎴戝鐞�", "鎴戝鎵�", "褰撳墠寰呮垜", "闇�瑕佹垜澶勭悊")) {
+        if (containsAny(text, "寰呮垜瀹℃壒", "寰呮垜瀹℃牳", "鎴戝鐞�", "鎴戝鎵�", "褰撳墠寰呮垜", "闇�瑕佹垜澶勭悊", "闇�瑕佸鐞�")) {
             return "approver";
         }
         return "related";
     }
 
+    private String extractRemark(String text) {
+        return firstNonBlank(firstNonBlank(extractTail(text, "澶囨敞"), extractTail(text, "鍘熷洜")), extractQuotedContent(text));
+    }
+
+    private String extractQuotedContent(String text) {
+        Matcher matcher = Pattern.compile("[鈥淺"]([^鈥漒"]+)[鈥漒"]").matcher(text);
+        return matcher.find() ? cleanContent(matcher.group(1)) : null;
+    }
+
+    private String normalizeForMatch(String text) {
+        if (!StringUtils.hasText(text)) {
+            return "";
+        }
+        return text.replace("锛�", "")
+                .replace(",", "")
+                .replace("銆�", "")
+                .replace(".", "")
+                .replace("锛�", "")
+                .replace("!", "")
+                .replace("锛�", "")
+                .replace("?", "")
+                .replace("锛�", "")
+                .replace(":", "")
+                .replace("锛�", "")
+                .replace(";", "")
+                .replace("鈥�", "")
+                .replace("鈥�", "")
+                .replace("\"", "")
+                .replace(" ", "")
+                .trim();
+    }
+
+    private boolean isPlaceholderApproveId(String approveId) {
+        if (!StringUtils.hasText(approveId)) {
+            return true;
+        }
+        String value = approveId.trim();
+        return "xxx".equalsIgnoreCase(value)
+                || value.matches("[xX]{2,}")
+                || "娴佺▼缂栧彿".equals(value)
+                || "缂栧彿".equals(value)
+                || value.contains("绀轰緥")
+                || value.contains("璇疯緭鍏�");
+    }
+
+    private String cleanContent(String text) {
+        if (!StringUtils.hasText(text)) {
+            return null;
+        }
+        return text.trim()
+                .replace("鈥�", "")
+                .replace("鈥�", "")
+                .replace("\"", "")
+                .replace("銆�", "")
+                .replace("锛�", "")
+                .replace(";", "")
+                .trim();
+    }
+
     private String firstNonBlank(String first, String second) {
         return StringUtils.hasText(first) ? first : second;
     }
diff --git a/src/main/java/com/ruoyi/ai/assistant/ManufacturingAgent.java b/src/main/java/com/ruoyi/ai/assistant/ManufacturingAgent.java
index f0e8cf7..0d16703 100644
--- a/src/main/java/com/ruoyi/ai/assistant/ManufacturingAgent.java
+++ b/src/main/java/com/ruoyi/ai/assistant/ManufacturingAgent.java
@@ -3,6 +3,7 @@
 import dev.langchain4j.service.MemoryId;
 import dev.langchain4j.service.SystemMessage;
 import dev.langchain4j.service.UserMessage;
+import dev.langchain4j.service.V;
 import dev.langchain4j.service.spring.AiService;
 import reactor.core.publisher.Flux;
 
@@ -17,5 +18,5 @@
 public interface ManufacturingAgent {
 
     @SystemMessage(fromResource = "manufacturing-agent-prompt.txt")
-    Flux<String> chat(@MemoryId String memoryId, @UserMessage String userMessage);
+    Flux<String> chat(@MemoryId String memoryId, @UserMessage String userMessage, @V("currentDate") String currentDate);
 }
diff --git a/src/main/java/com/ruoyi/ai/assistant/PurchaseAgent.java b/src/main/java/com/ruoyi/ai/assistant/PurchaseAgent.java
index 6a4ff4e..421261d 100644
--- a/src/main/java/com/ruoyi/ai/assistant/PurchaseAgent.java
+++ b/src/main/java/com/ruoyi/ai/assistant/PurchaseAgent.java
@@ -3,6 +3,7 @@
 import dev.langchain4j.service.MemoryId;
 import dev.langchain4j.service.SystemMessage;
 import dev.langchain4j.service.UserMessage;
+import dev.langchain4j.service.V;
 import dev.langchain4j.service.spring.AiService;
 import reactor.core.publisher.Flux;
 
@@ -17,5 +18,5 @@
 public interface PurchaseAgent {
 
     @SystemMessage(fromResource = "purchase-agent-prompt.txt")
-    Flux<String> chat(@MemoryId String memoryId, @UserMessage String userMessage);
+    Flux<String> chat(@MemoryId String memoryId, @UserMessage String userMessage, @V("currentDate") String currentDate);
 }
diff --git a/src/main/java/com/ruoyi/ai/assistant/PurchaseIntentExecutor.java b/src/main/java/com/ruoyi/ai/assistant/PurchaseIntentExecutor.java
index 5991fc3..c04915e 100644
--- a/src/main/java/com/ruoyi/ai/assistant/PurchaseIntentExecutor.java
+++ b/src/main/java/com/ruoyi/ai/assistant/PurchaseIntentExecutor.java
@@ -4,6 +4,9 @@
 import org.springframework.stereotype.Component;
 import org.springframework.util.StringUtils;
 
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -11,8 +14,12 @@
 public class PurchaseIntentExecutor {
 
     private static final Pattern ID_PATTERN = Pattern.compile("\\b\\d{1,12}\\b");
-    private static final Pattern LIMIT_PATTERN = Pattern.compile("(鍓峾鏈�杩�)?(\\d{1,2})鏉�");
-    private static final Pattern DATE_PATTERN = Pattern.compile("\\d{4}-\\d{2}-\\d{2}");
+    private static final Pattern LIMIT_PATTERN = Pattern.compile("(鍓峾鏈�杩�)?\\s*(\\d{1,2})\\s*鏉�");
+    private static final Pattern DATE_PATTERN = Pattern.compile("(\\d{4}-\\d{2}-\\d{2})");
+    private static final Pattern RELATIVE_RANGE_PATTERN = Pattern.compile("(杩憒鏈�杩�)\\s*(\\d{1,3})\\s*(澶﹟鍛▅涓湀|鏈坾骞�)");
+    private static final Pattern HALF_RANGE_PATTERN = Pattern.compile("(鏈�杩憒杩�)?鍗�(涓�)?(鏈坾骞�)");
+    private static final DateTimeFormatter DATE_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+    private static final ZoneId CHINA_ZONE_ID = ZoneId.of("Asia/Shanghai");
 
     private final PurchaseAgentTools purchaseAgentTools;
 
@@ -25,71 +32,63 @@
             return null;
         }
         String text = message.trim();
+        String quickPromptResponse = tryExecuteQuickPrompt(memoryId, text);
+        if (StringUtils.hasText(quickPromptResponse)) {
+            return quickPromptResponse;
+        }
 
-        if (containsAny(text, "鎺掕", "鎺掑悕", "鍓嶅嚑", "鍓嶄簲", "鍓嶅崄") && containsAny(text, "鐗╂枡", "浜у搧", "鍘熸潗鏂�", "閲囪喘閲戦", "閲戦")) {
-            return purchaseAgentTools.rankPurchaseMaterials(
-                    memoryId,
-                    extractStartDate(text),
-                    extractEndDate(text),
-                    text,
-                    extractLimit(text)
-            );
+        String keyword = extractKeyword(text);
+        Integer limit = extractLimit(text);
+        DateRange dateRange = extractDateRange(text);
+        String startDate = dateRange.startDate();
+        String endDate = dateRange.endDate();
+
+        if (containsAny(text, "鎺掕", "鎺掑悕", "鍓嶅嚑", "鍓嶄簲", "鍓嶅崄")
+                && containsAny(text, "鐗╂枡", "浜у搧", "鍘熸潗鏂�", "閲囪喘閲戦", "閲戦")) {
+            return purchaseAgentTools.rankPurchaseMaterials(memoryId, startDate, endDate, text, limit);
         }
         if (containsAny(text, "鏈叆搴�", "寰呭叆搴�", "娌℃湁鍏ュ簱", "杩樻湭鍏ュ簱")) {
-            return purchaseAgentTools.listUnstockedPurchaseOrders(
-                    memoryId,
-                    extractStartDate(text),
-                    extractEndDate(text),
-                    extractKeyword(text),
-                    extractLimit(text)
-            );
+            return purchaseAgentTools.listUnstockedPurchaseOrders(memoryId, startDate, endDate, keyword, limit);
         }
         if (containsAny(text, "鍒拌揣寮傚父", "鍒拌揣鏈夊紓甯�", "寮傚父鍒拌揣", "鍒拌揣闂", "渚涘簲鍟嗗埌璐у紓甯�")) {
-            return purchaseAgentTools.listArrivalExceptions(
-                    memoryId,
-                    extractStartDate(text),
-                    extractEndDate(text),
-                    text,
-                    extractLimit(text)
-            );
+            return purchaseAgentTools.listArrivalExceptions(memoryId, startDate, endDate, text, limit);
         }
         if (containsAny(text, "寰呬粯娆�", "鏈粯娆�", "鏈粯娓�", "寰呮敮浠�", "搴斾粯")) {
-            return purchaseAgentTools.listPendingPaymentOrders(
-                    memoryId,
-                    extractStartDate(text),
-                    extractEndDate(text),
-                    extractKeyword(text),
-                    extractLimit(text)
-            );
+            return purchaseAgentTools.listPendingPaymentOrders(memoryId, startDate, endDate, keyword, limit);
         }
         if (containsAny(text, "閫�璐�", "閫�鏂�", "鎷掓敹")) {
-            return purchaseAgentTools.listPurchaseReturns(
-                    memoryId,
-                    extractStartDate(text),
-                    extractEndDate(text),
-                    extractKeyword(text),
-                    extractLimit(text)
-            );
+            return purchaseAgentTools.listPurchaseReturns(memoryId, startDate, endDate, keyword, limit);
         }
         if (isStatsIntent(text)) {
-            return purchaseAgentTools.getPurchaseStats(
-                    memoryId,
-                    extractStartDate(text),
-                    extractEndDate(text),
-                    text
-            );
+            return purchaseAgentTools.getPurchaseStats(memoryId, startDate, endDate, text);
         }
-        if (containsAny(text, "璇︽儏", "鏄庣粏") && extractId(text) != null) {
-            return purchaseAgentTools.getPurchaseLedgerDetail(memoryId, extractId(text));
+
+        Long ledgerId = extractId(text);
+        if (containsAny(text, "璇︽儏", "鏄庣粏") && ledgerId != null) {
+            return purchaseAgentTools.getPurchaseLedgerDetail(memoryId, ledgerId);
         }
         if (containsAny(text, "鍙拌处", "閲囪喘鍗�", "閲囪喘璁㈠崟", "璁㈠崟", "鍚堝悓", "鍒楄〃", "鏌ヨ")) {
-            return purchaseAgentTools.listPurchaseLedgers(
-                    memoryId,
-                    extractKeyword(text),
-                    extractStartDate(text),
-                    extractEndDate(text),
-                    extractLimit(text)
-            );
+            return purchaseAgentTools.listPurchaseLedgers(memoryId, keyword, startDate, endDate, limit);
+        }
+        return null;
+    }
+
+    private String tryExecuteQuickPrompt(String memoryId, String text) {
+        String normalized = normalizeForMatch(text);
+        if ("鏈湀閲囪喘閲戦鎺掑悕鍓嶅崄鐨勭墿鏂欐湁鍝簺".equals(normalized)) {
+            return purchaseAgentTools.rankPurchaseMaterials(memoryId, null, null, "鏈湀", 10);
+        }
+        if ("鍝簺閲囪喘璁㈠崟杩樻湭鍏ュ簱".equals(normalized)) {
+            return purchaseAgentTools.listUnstockedPurchaseOrders(memoryId, null, null, null, 10);
+        }
+        if ("鏈�杩�7澶╀緵搴斿晢鍒拌揣寮傚父鏈夊摢浜�".equals(normalized)) {
+            return purchaseAgentTools.listArrivalExceptions(memoryId, null, null, "鏈�杩�7澶�", 10);
+        }
+        if ("甯垜缁熻寰呬粯娆鹃噰璐崟".equals(normalized)) {
+            return purchaseAgentTools.listPendingPaymentOrders(memoryId, null, null, null, 10);
+        }
+        if ("鍒楀嚭鏈湀閲囪喘閫�璐ф儏鍐�".equals(normalized)) {
+            return purchaseAgentTools.listPurchaseReturns(memoryId, null, null, null, 10);
         }
         return null;
     }
@@ -100,8 +99,10 @@
         }
         boolean queryWord = containsAny(text, "鏌ヨ", "鏌ョ湅", "鐪嬩笅", "鐪嬬湅", "鑾峰彇");
         boolean dataWord = containsAny(text, "鏁版嵁", "閲戦", "鏁伴噺", "鍚堝悓棰�", "浠樻棰�", "鍙戠エ棰�");
-        boolean timeWord = containsAny(text, "浠婂ぉ", "鏈懆", "鏈湀", "涓婃湀", "浠婂勾", "鍘诲勾", "杩戝崐骞�", "鏈�杩戝崐涓湀", "鍗婁釜鏈�")
-                || DATE_PATTERN.matcher(text).find();
+        boolean timeWord = containsAny(text, "浠婂ぉ", "鏄ㄥぉ", "鏈懆", "涓婂懆", "鏈湀", "涓婃湀", "浠婂勾", "鍘诲勾", "杩戝崐骞�", "鏈�杩戝崐涓湀", "鍗婁釜鏈�")
+                || DATE_PATTERN.matcher(text).find()
+                || RELATIVE_RANGE_PATTERN.matcher(text).find()
+                || HALF_RANGE_PATTERN.matcher(text).find();
         return queryWord && dataWord && timeWord;
     }
 
@@ -127,23 +128,125 @@
         return matcher.find() ? Integer.parseInt(matcher.group(2)) : 10;
     }
 
-    private String extractStartDate(String text) {
+    private DateRange extractDateRange(String text) {
         Matcher matcher = DATE_PATTERN.matcher(text);
-        return matcher.find() ? matcher.group() : null;
+        if (matcher.find()) {
+            String first = matcher.group(1);
+            String second = matcher.find() ? matcher.group(1) : first;
+            return buildDateRange(first, second);
+        }
+
+        LocalDate today = LocalDate.now(CHINA_ZONE_ID);
+        if (text.contains("浠婂ぉ")) {
+            return new DateRange(formatDate(today), formatDate(today));
+        }
+        if (text.contains("鏄ㄥぉ")) {
+            LocalDate yesterday = today.minusDays(1);
+            return new DateRange(formatDate(yesterday), formatDate(yesterday));
+        }
+        if (text.contains("鏈懆")) {
+            LocalDate start = today.minusDays(today.getDayOfWeek().getValue() - 1L);
+            return new DateRange(formatDate(start), formatDate(today));
+        }
+        if (text.contains("涓婂懆")) {
+            LocalDate thisWeekStart = today.minusDays(today.getDayOfWeek().getValue() - 1L);
+            LocalDate start = thisWeekStart.minusWeeks(1);
+            LocalDate end = start.plusDays(6);
+            return new DateRange(formatDate(start), formatDate(end));
+        }
+        if (text.contains("鏈湀")) {
+            return new DateRange(formatDate(today.withDayOfMonth(1)), formatDate(today));
+        }
+        if (text.contains("涓婃湀")) {
+            LocalDate start = today.minusMonths(1).withDayOfMonth(1);
+            return new DateRange(formatDate(start), formatDate(start.withDayOfMonth(start.lengthOfMonth())));
+        }
+        if (text.contains("浠婂勾") || text.contains("鏈勾")) {
+            return new DateRange(formatDate(today.withDayOfYear(1)), formatDate(today));
+        }
+        if (text.contains("鍘诲勾")) {
+            LocalDate start = today.minusYears(1).withDayOfYear(1);
+            LocalDate end = start.withDayOfYear(start.lengthOfYear());
+            return new DateRange(formatDate(start), formatDate(end));
+        }
+        if (containsAny(text, "杩戝崐骞�", "鏈�杩戝崐骞�")) {
+            return new DateRange(formatDate(today.minusMonths(6).plusDays(1)), formatDate(today));
+        }
+        if (containsAny(text, "杩戝崐涓湀", "鏈�杩戝崐涓湀", "鍗婁釜鏈�")) {
+            return new DateRange(formatDate(today.minusDays(14)), formatDate(today));
+        }
+
+        Matcher relativeMatcher = RELATIVE_RANGE_PATTERN.matcher(text);
+        if (relativeMatcher.find()) {
+            int amount = Integer.parseInt(relativeMatcher.group(2));
+            String unit = relativeMatcher.group(3);
+            LocalDate start = switch (unit) {
+                case "澶�" -> today.minusDays(Math.max(amount - 1L, 0));
+                case "鍛�" -> today.minusWeeks(Math.max(amount, 1)).plusDays(1);
+                case "涓湀", "鏈�" -> today.minusMonths(Math.max(amount, 1)).plusDays(1);
+                case "骞�" -> today.minusYears(Math.max(amount, 1)).plusDays(1);
+                default -> today.minusDays(29);
+            };
+            return new DateRange(formatDate(start), formatDate(today));
+        }
+
+        return new DateRange(null, null);
     }
 
-    private String extractEndDate(String text) {
-        Matcher matcher = DATE_PATTERN.matcher(text);
-        if (!matcher.find()) {
+    private DateRange buildDateRange(String start, String end) {
+        LocalDate startDate = parseDate(start);
+        LocalDate endDate = parseDate(end);
+        if (startDate == null || endDate == null) {
+            return new DateRange(null, null);
+        }
+        if (startDate.isAfter(endDate)) {
+            LocalDate temp = startDate;
+            startDate = endDate;
+            endDate = temp;
+        }
+        return new DateRange(formatDate(startDate), formatDate(endDate));
+    }
+
+    private LocalDate parseDate(String text) {
+        try {
+            return LocalDate.parse(text, DATE_FMT);
+        } catch (Exception ignored) {
             return null;
         }
-        return matcher.find() ? matcher.group() : null;
+    }
+
+    private String formatDate(LocalDate date) {
+        return date == null ? null : date.format(DATE_FMT);
+    }
+
+    private String normalizeForMatch(String text) {
+        if (!StringUtils.hasText(text)) {
+            return "";
+        }
+        return text.replace("锛�", "")
+                .replace(",", "")
+                .replace("銆�", "")
+                .replace(".", "")
+                .replace("锛�", "")
+                .replace("!", "")
+                .replace("锛�", "")
+                .replace("?", "")
+                .replace("锛�", "")
+                .replace(":", "")
+                .replace("锛�", "")
+                .replace(";", "")
+                .replace(" ", "")
+                .trim();
     }
 
     private String extractKeyword(String text) {
         String cleaned = text
                 .replace("鏌ヨ", "")
                 .replace("鏌ョ湅", "")
+                .replace("鐪嬩笅", "")
+                .replace("鐪嬬湅", "")
+                .replace("璇�", "")
+                .replace("涓�涓�", "")
                 .replace("閲囪喘", "")
                 .replace("閲囪喘鍗�", "")
                 .replace("閲囪喘璁㈠崟", "")
@@ -153,9 +256,33 @@
                 .replace("鍝簺", "")
                 .replace("鍒楀嚭", "")
                 .replace("甯垜", "")
+                .replace("缁熻", "")
+                .replace("鍒嗘瀽", "")
+                .replace("鏈湀", "")
+                .replace("涓婃湀", "")
+                .replace("鏈勾", "")
+                .replace("浠婂勾", "")
+                .replace("鍘诲勾", "")
+                .replace("鏈懆", "")
+                .replace("涓婂懆", "")
+                .replace("浠婂ぉ", "")
+                .replace("鏄ㄥぉ", "")
+                .replace("杩�30澶�", "")
+                .replace("杩�7澶�", "")
+                .replace("杩�15澶�", "")
+                .replace("杩�60澶�", "")
+                .replace("鏈�杩�30澶�", "")
+                .replace("鏈�杩�7澶�", "")
+                .replace("鏈�杩�15澶�", "")
+                .replace("鏈�杩�60澶�", "")
                 .replace("鏈�杩�10鏉�", "")
                 .replace("鍓�10鏉�", "")
+                .replace("鍓�20鏉�", "")
+                .replace("鏈�杩�20鏉�", "")
                 .trim();
         return cleaned.length() >= 2 ? cleaned : null;
     }
+
+    private record DateRange(String startDate, String endDate) {
+    }
 }
diff --git a/src/main/java/com/ruoyi/ai/assistant/SalesAgent.java b/src/main/java/com/ruoyi/ai/assistant/SalesAgent.java
new file mode 100644
index 0000000..e2f9a81
--- /dev/null
+++ b/src/main/java/com/ruoyi/ai/assistant/SalesAgent.java
@@ -0,0 +1,22 @@
+package com.ruoyi.ai.assistant;
+
+import dev.langchain4j.service.MemoryId;
+import dev.langchain4j.service.SystemMessage;
+import dev.langchain4j.service.UserMessage;
+import dev.langchain4j.service.V;
+import dev.langchain4j.service.spring.AiService;
+import reactor.core.publisher.Flux;
+
+import static dev.langchain4j.service.spring.AiServiceWiringMode.EXPLICIT;
+
+@AiService(
+        wiringMode = EXPLICIT,
+        streamingChatModel = "qwenStreamingChatModel",
+        chatMemoryProvider = "chatMemoryProviderSales",
+        tools = "salesAgentTools"
+)
+public interface SalesAgent {
+
+    @SystemMessage(fromResource = "sales-agent-prompt.txt")
+    Flux<String> chat(@MemoryId String memoryId, @UserMessage String userMessage, @V("currentDate") String currentDate);
+}
diff --git a/src/main/java/com/ruoyi/ai/assistant/SalesIntentExecutor.java b/src/main/java/com/ruoyi/ai/assistant/SalesIntentExecutor.java
new file mode 100644
index 0000000..4388a3c
--- /dev/null
+++ b/src/main/java/com/ruoyi/ai/assistant/SalesIntentExecutor.java
@@ -0,0 +1,270 @@
+package com.ruoyi.ai.assistant;
+
+import com.ruoyi.ai.tools.SalesAgentTools;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import java.time.LocalDate;
+import java.time.YearMonth;
+import java.time.format.DateTimeFormatter;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+@Component
+public class SalesIntentExecutor {
+
+    private static final DateTimeFormatter DATE_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+    private static final Pattern LIMIT_PATTERN = Pattern.compile("(鍓峾鏈�杩�)?\\s*(\\d{1,2})\\s*鏉�");
+    private static final Pattern DATE_PATTERN = Pattern.compile("(\\d{4}-\\d{2}-\\d{2})");
+    private static final Pattern RELATIVE_DAY_PATTERN = Pattern.compile("(杩憒鏈�杩�)?\\s*(\\d{1,3})\\s*澶�");
+
+    private final SalesAgentTools salesAgentTools;
+
+    public SalesIntentExecutor(SalesAgentTools salesAgentTools) {
+        this.salesAgentTools = salesAgentTools;
+    }
+
+    public String tryExecute(String memoryId, String message) {
+        if (!StringUtils.hasText(message)) {
+            return null;
+        }
+        String text = message.trim();
+
+        String quickPromptResponse = tryExecuteQuickPrompt(memoryId, text);
+        if (StringUtils.hasText(quickPromptResponse)) {
+            return quickPromptResponse;
+        }
+
+        String keyword = extractKeyword(text);
+        Integer limit = extractLimit(text);
+        DateRange dateRange = extractDateRange(text);
+        String startDate = dateRange.startDate();
+        String endDate = dateRange.endDate();
+
+        if (containsAny(text, "娴佸け", "娴佸け椋庨櫓", "瀹㈡埛娴佸け", "椋庨櫓鍒嗘瀽")) {
+            return salesAgentTools.analyzeCustomerChurnRisk(memoryId, startDate, endDate, text, keyword, limit);
+        }
+        if (containsAny(text, "鍥炴", "鏀舵", "鎶ヤ环")
+                && containsAny(text, "寤鸿", "绛栫暐", "浼樺寲", "鏂规")) {
+            return salesAgentTools.suggestCollectionAndQuotationStrategy(
+                    memoryId, startDate, endDate, text, keyword, limit, shouldPrioritizeHighRisk(text));
+        }
+        if (containsAny(text, "鎸囨爣", "缁熻", "鐪嬫澘", "鎬昏", "缁忚惀鍒嗘瀽")) {
+            return salesAgentTools.getSalesDashboard(memoryId, startDate, endDate, text);
+        }
+        if (containsAny(text, "瀹㈡埛妗f", "绉佹捣", "鍏捣", "瀹㈡埛姹�")) {
+            return salesAgentTools.listCustomerProfiles(memoryId, extractSeaType(text), keyword, limit);
+        }
+        if (containsAny(text, "閿�鍞姤浠�", "鎶ヤ环鍗�", "鎶ヤ环", "璇环")) {
+            return salesAgentTools.listSalesQuotations(memoryId, keyword, startDate, endDate, limit);
+        }
+        if (containsAny(text, "閿�鍞��璐�", "閫�璐�", "閫�娆�")) {
+            return salesAgentTools.listSalesReturns(memoryId, startDate, endDate, keyword, limit);
+        }
+        if (containsAny(text, "瀹㈡埛寰�鏉�", "寰�鏉�", "鍥炴", "搴旀敹", "鏉ユ", "鏀舵鏄庣粏")) {
+            return salesAgentTools.listCustomerInteractions(memoryId, keyword, startDate, endDate, limit);
+        }
+        if (containsAny(text, "鍙戣揣鍙拌处", "鍙戣揣", "鐗╂祦", "蹇��", "杩愯緭")) {
+            return salesAgentTools.listShippingLedgers(memoryId, keyword, startDate, endDate, limit);
+        }
+        if (containsAny(text, "閿�鍞彴璐�", "閿�鍞悎鍚�", "閿�鍞鍗�", "鍚堝悓鍙拌处", "璁㈠崟鍙拌处")) {
+            return salesAgentTools.listSalesLedgers(memoryId, keyword, startDate, endDate, limit);
+        }
+        return null;
+    }
+
+    private String tryExecuteQuickPrompt(String memoryId, String text) {
+        String normalized = normalizeForMatch(text);
+        if ("鏌ヨ绉佹捣瀹㈡埛妗f鍓�10鏉�".equals(normalized)) {
+            return salesAgentTools.listCustomerProfiles(memoryId, "private", null, 10);
+        }
+        if ("鏌ヨ鍏捣瀹㈡埛妗f".equals(normalized)) {
+            return salesAgentTools.listCustomerProfiles(memoryId, "public", null, 10);
+        }
+        if ("鏌ヨ鏈湀閿�鍞姤浠�".equals(normalized)) {
+            DateRange range = monthRange();
+            return salesAgentTools.listSalesQuotations(memoryId, null, range.startDate(), range.endDate(), 10);
+        }
+        if ("鏌ヨ鏈湀閿�鍞彴璐�".equals(normalized)) {
+            DateRange range = monthRange();
+            return salesAgentTools.listSalesLedgers(memoryId, null, range.startDate(), range.endDate(), 10);
+        }
+        if ("鏌ヨ杩�30澶╅攢鍞��璐�".equals(normalized)) {
+            DateRange range = recentDaysRange(30);
+            return salesAgentTools.listSalesReturns(memoryId, range.startDate(), range.endDate(), null, 10);
+        }
+        if ("鏌ヨ杩�30澶╁鎴峰洖娆惧線鏉�".equals(normalized)) {
+            DateRange range = recentDaysRange(30);
+            return salesAgentTools.listCustomerInteractions(memoryId, null, range.startDate(), range.endDate(), 10);
+        }
+        if ("鏌ヨ鏈湀鍙戣揣鍙拌处".equals(normalized)) {
+            DateRange range = monthRange();
+            return salesAgentTools.listShippingLedgers(memoryId, null, range.startDate(), range.endDate(), 10);
+        }
+        if ("鏌ョ湅閿�鍞寚鏍囩粺璁�".equals(normalized)) {
+            return salesAgentTools.getSalesDashboard(memoryId, null, null, "鏈湀");
+        }
+        if ("甯垜鍋氬鎴锋祦澶遍闄╁垎鏋愯繎30澶╁墠20鏉�".equals(normalized)) {
+            DateRange range = recentDaysRange(30);
+            return salesAgentTools.analyzeCustomerChurnRisk(memoryId, range.startDate(), range.endDate(), "杩�30澶�", null, 20);
+        }
+        if ("鐢熸垚鍥炴涓庢姤浠风瓥鐣ュ缓璁紭鍏堥珮椋庨櫓瀹㈡埛".equals(normalized)) {
+            DateRange range = recentDaysRange(30);
+            return salesAgentTools.suggestCollectionAndQuotationStrategy(memoryId, range.startDate(), range.endDate(), "杩�30澶�", null, 10, true);
+        }
+        return null;
+    }
+
+    private boolean containsAny(String text, String... keywords) {
+        for (String keyword : keywords) {
+            if (text.contains(keyword)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private String extractSeaType(String text) {
+        if (text.contains("鍏捣")) {
+            return "public";
+        }
+        if (text.contains("绉佹捣")) {
+            return "private";
+        }
+        return null;
+    }
+
+    private Integer extractLimit(String text) {
+        Matcher matcher = LIMIT_PATTERN.matcher(text);
+        return matcher.find() ? Integer.parseInt(matcher.group(2)) : 10;
+    }
+
+    private DateRange extractDateRange(String text) {
+        Matcher matcher = DATE_PATTERN.matcher(text);
+        if (matcher.find()) {
+            String first = matcher.group(1);
+            String second = matcher.find() ? matcher.group(1) : first;
+            return buildDateRange(first, second);
+        }
+        if (text.contains("鏈湀")) {
+            return monthRange();
+        }
+        if (text.contains("涓婃湀")) {
+            return lastMonthRange();
+        }
+        if (text.contains("鏈勾") || text.contains("浠婂勾")) {
+            return yearRange();
+        }
+        Matcher relativeDayMatcher = RELATIVE_DAY_PATTERN.matcher(text);
+        if (relativeDayMatcher.find()) {
+            int days = Integer.parseInt(relativeDayMatcher.group(2));
+            return recentDaysRange(days);
+        }
+        return new DateRange(null, null);
+    }
+
+    private DateRange buildDateRange(String start, String end) {
+        LocalDate startDate = parseDate(start);
+        LocalDate endDate = parseDate(end);
+        if (startDate == null || endDate == null) {
+            return new DateRange(null, null);
+        }
+        if (startDate.isAfter(endDate)) {
+            LocalDate temp = startDate;
+            startDate = endDate;
+            endDate = temp;
+        }
+        return new DateRange(formatDate(startDate), formatDate(endDate));
+    }
+
+    private DateRange recentDaysRange(int days) {
+        LocalDate end = LocalDate.now();
+        int safeDays = Math.max(days, 1);
+        LocalDate start = end.minusDays(safeDays - 1L);
+        return new DateRange(formatDate(start), formatDate(end));
+    }
+
+    private DateRange monthRange() {
+        LocalDate today = LocalDate.now();
+        return new DateRange(formatDate(today.withDayOfMonth(1)), formatDate(today));
+    }
+
+    private DateRange lastMonthRange() {
+        YearMonth lastMonth = YearMonth.now().minusMonths(1);
+        return new DateRange(formatDate(lastMonth.atDay(1)), formatDate(lastMonth.atEndOfMonth()));
+    }
+
+    private DateRange yearRange() {
+        LocalDate today = LocalDate.now();
+        return new DateRange(formatDate(today.withDayOfYear(1)), formatDate(today));
+    }
+
+    private LocalDate parseDate(String text) {
+        try {
+            return LocalDate.parse(text, DATE_FMT);
+        } catch (Exception ignored) {
+            return null;
+        }
+    }
+
+    private String formatDate(LocalDate date) {
+        return date == null ? null : date.format(DATE_FMT);
+    }
+
+    private String normalizeForMatch(String text) {
+        if (!StringUtils.hasText(text)) {
+            return "";
+        }
+        return text.replace("锛�", "")
+                .replace(",", "")
+                .replace("銆�", "")
+                .replace(".", "")
+                .replace("锛�", "")
+                .replace("!", "")
+                .replace("锛�", "")
+                .replace("?", "")
+                .replace("锛�", "")
+                .replace(":", "")
+                .replace("锛�", "")
+                .replace(";", "")
+                .replace(" ", "")
+                .trim();
+    }
+
+    private Boolean shouldPrioritizeHighRisk(String text) {
+        return containsAny(text, "浼樺厛楂橀闄�", "楂橀闄╁鎴�", "楂橀闄�");
+    }
+
+    private String extractKeyword(String text) {
+        String cleaned = text
+                .replace("鏌ヨ", "")
+                .replace("鏌ョ湅", "")
+                .replace("鐪嬩笅", "")
+                .replace("鐪嬬湅", "")
+                .replace("甯垜", "")
+                .replace("璇�", "")
+                .replace("涓�涓�", "")
+                .replace("閿�鍞�", "")
+                .replace("瀹㈡埛妗f", "")
+                .replace("鎶ヤ环鍗�", "")
+                .replace("閿�鍞姤浠�", "")
+                .replace("閿�鍞彴璐�", "")
+                .replace("鍙戣揣鍙拌处", "")
+                .replace("瀹㈡埛寰�鏉�", "")
+                .replace("閿�鍞��璐�", "")
+                .replace("鍓�10鏉�", "")
+                .replace("鏈�杩�10鏉�", "")
+                .replace("鍓�20鏉�", "")
+                .replace("鏈�杩�20鏉�", "")
+                .replace("杩�30澶�", "")
+                .replace("鏈湀", "")
+                .replace("鏈勾", "")
+                .replace("浠婂勾", "")
+                .replace("鏉�", "")
+                .trim();
+        return cleaned.length() >= 2 ? cleaned : null;
+    }
+
+    private record DateRange(String startDate, String endDate) {
+    }
+}
diff --git a/src/main/java/com/ruoyi/ai/config/SalesAgentConfig.java b/src/main/java/com/ruoyi/ai/config/SalesAgentConfig.java
new file mode 100644
index 0000000..aed3104
--- /dev/null
+++ b/src/main/java/com/ruoyi/ai/config/SalesAgentConfig.java
@@ -0,0 +1,21 @@
+package com.ruoyi.ai.config;
+
+import com.ruoyi.ai.store.MongoChatMemoryStore;
+import dev.langchain4j.memory.chat.ChatMemoryProvider;
+import dev.langchain4j.memory.chat.MessageWindowChatMemory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class SalesAgentConfig {
+
+    @Bean
+    ChatMemoryProvider chatMemoryProviderSales(MongoChatMemoryStore mongoChatMemoryStore) {
+        return memoryId -> MessageWindowChatMemory.builder()
+                .id(memoryId)
+                .maxMessages(30)
+                .chatMemoryStore(mongoChatMemoryStore)
+                .build();
+    }
+}
+
diff --git a/src/main/java/com/ruoyi/ai/controller/ManufacturingAiController.java b/src/main/java/com/ruoyi/ai/controller/ManufacturingAiController.java
index cb7c0ba..d36a321 100644
--- a/src/main/java/com/ruoyi/ai/controller/ManufacturingAiController.java
+++ b/src/main/java/com/ruoyi/ai/controller/ManufacturingAiController.java
@@ -10,7 +10,7 @@
 import com.ruoyi.common.utils.StringUtils;
 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;
 import dev.langchain4j.data.message.AiMessage;
 import dev.langchain4j.data.message.UserMessage;
 import io.swagger.v3.oas.annotations.Operation;
@@ -24,12 +24,18 @@
 import org.springframework.web.bind.annotation.RestController;
 import reactor.core.publisher.Flux;
 
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 
 @Tag(name = "鍒堕�犳櫤鑳藉姪鎵�")
 @RestController
 @RequestMapping("/manufacturing-ai")
 public class ManufacturingAiController extends BaseController {
+
+    private static final DateTimeFormatter CURRENT_DATE_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+    private static final ZoneId CHINA_ZONE_ID = ZoneId.of("Asia/Shanghai");
 
     private final ManufacturingAgent manufacturingAgent;
     private final ManufacturingIntentExecutor manufacturingIntentExecutor;
@@ -76,27 +82,32 @@
             return Flux.just(directResponse);
         }
 
-        return manufacturingAgent.chat(memoryId, userMessage)
+        return manufacturingAgent.chat(memoryId, userMessage, currentDateForPrompt())
                 .doOnComplete(() -> aiChatSessionService.refreshSessionStats(memoryId, loginUser))
                 .doOnError(ex -> aiChatSessionService.refreshSessionStats(memoryId, loginUser));
     }
 
     @Operation(summary = "鍒堕�犱細璇濆垪琛�")
     @GetMapping("/history/sessions")
-    public AjaxResult listSessions() {
-        return success(aiChatSessionService.listCurrentUserSessions(SecurityUtils.getLoginUser()));
+    public R<?> listSessions() {
+        return R.ok(aiChatSessionService.listCurrentUserSessions(SecurityUtils.getLoginUser()));
     }
 
     @Operation(summary = "鍒堕�犱細璇濇秷鎭�")
     @GetMapping("/history/messages/{memoryId}")
-    public AjaxResult listMessages(@PathVariable String memoryId) {
-        return success(aiChatSessionService.listCurrentUserMessages(memoryId, SecurityUtils.getLoginUser()));
+    public R<?> listMessages(@PathVariable String memoryId) {
+        return R.ok(aiChatSessionService.listCurrentUserMessages(memoryId, SecurityUtils.getLoginUser()));
     }
 
     @Operation(summary = "鍒犻櫎鍒堕�犱細璇�")
     @DeleteMapping("/history/{memoryId}")
-    public AjaxResult deleteSession(@PathVariable String memoryId) {
+    public R<?> deleteSession(@PathVariable String memoryId) {
         aiSessionUserContext.remove(memoryId);
-        return toAjax(aiChatSessionService.deleteCurrentUserSession(memoryId, SecurityUtils.getLoginUser()));
+        aiChatSessionService.deleteCurrentUserSession(memoryId, SecurityUtils.getLoginUser());
+        return R.ok();
+    }
+
+    private String currentDateForPrompt() {
+        return LocalDate.now(CHINA_ZONE_ID).format(CURRENT_DATE_FMT);
     }
 }
diff --git a/src/main/java/com/ruoyi/ai/controller/PurchaseAiController.java b/src/main/java/com/ruoyi/ai/controller/PurchaseAiController.java
index 158ea61..e1e605e 100644
--- a/src/main/java/com/ruoyi/ai/controller/PurchaseAiController.java
+++ b/src/main/java/com/ruoyi/ai/controller/PurchaseAiController.java
@@ -6,17 +6,10 @@
 import com.ruoyi.common.utils.SecurityUtils;
 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;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import reactor.core.publisher.Flux;
 
@@ -49,28 +42,28 @@
 
     @Operation(summary = "閲囪喘澶氭枃浠跺垎鏋愮‘璁ゅ鐞�")
     @PostMapping("/analyze-files/confirm")
-    public AjaxResult confirmAnalyzeResult(@RequestBody PurchaseAiConfirmRequest request) {
+    public R confirmAnalyzeResult(@RequestBody PurchaseAiConfirmRequest request) {
         return purchaseAiService.confirmAnalyzeResult(request);
     }
 
     @Operation(summary = "閲囪喘浼氳瘽鍒楄〃")
     @GetMapping("/history/sessions")
-    public AjaxResult listSessions() {
+    public R listSessions() {
         LoginUser loginUser = SecurityUtils.getLoginUser();
-        return success(purchaseAiService.listSessions(loginUser));
+        return R.ok(purchaseAiService.listSessions(loginUser));
     }
 
     @Operation(summary = "閲囪喘浼氳瘽娑堟伅")
     @GetMapping("/history/messages/{memoryId}")
-    public AjaxResult listMessages(@PathVariable String memoryId) {
+    public R listMessages(@PathVariable String memoryId) {
         LoginUser loginUser = SecurityUtils.getLoginUser();
-        return success(purchaseAiService.listMessages(memoryId, loginUser));
+        return R.ok(purchaseAiService.listMessages(memoryId, loginUser));
     }
 
     @Operation(summary = "鍒犻櫎閲囪喘浼氳瘽")
     @DeleteMapping("/history/{memoryId}")
-    public AjaxResult deleteSession(@PathVariable String memoryId) {
+    public R deleteSession(@PathVariable String memoryId) {
         LoginUser loginUser = SecurityUtils.getLoginUser();
-        return toAjax(purchaseAiService.deleteSession(memoryId, loginUser));
+        return R.ok(purchaseAiService.deleteSession(memoryId, loginUser));
     }
 }
diff --git a/src/main/java/com/ruoyi/ai/controller/SalesAiController.java b/src/main/java/com/ruoyi/ai/controller/SalesAiController.java
new file mode 100644
index 0000000..b6ca0e9
--- /dev/null
+++ b/src/main/java/com/ruoyi/ai/controller/SalesAiController.java
@@ -0,0 +1,142 @@
+package com.ruoyi.ai.controller;
+
+import com.ruoyi.ai.assistant.SalesAgent;
+import com.ruoyi.ai.assistant.SalesIntentExecutor;
+import com.ruoyi.ai.bean.ChatForm;
+import com.ruoyi.ai.context.AiSessionUserContext;
+import com.ruoyi.ai.service.AiChatSessionService;
+import com.ruoyi.ai.store.MongoChatMemoryStore;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.framework.security.LoginUser;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
+import dev.langchain4j.data.message.AiMessage;
+import dev.langchain4j.data.message.UserMessage;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import reactor.core.publisher.Flux;
+
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+@Tag(name = "閿�鍞姪鎵嬫櫤鑳戒綋")
+@RestController
+@RequestMapping("/sales-ai")
+public class SalesAiController extends BaseController {
+
+    private static final DateTimeFormatter CURRENT_DATE_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+    private static final ZoneId CHINA_ZONE_ID = ZoneId.of("Asia/Shanghai");
+
+    private final SalesAgent salesAgent;
+    private final SalesIntentExecutor salesIntentExecutor;
+    private final AiSessionUserContext aiSessionUserContext;
+    private final MongoChatMemoryStore mongoChatMemoryStore;
+    private final AiChatSessionService aiChatSessionService;
+
+    public SalesAiController(SalesAgent salesAgent,
+                             SalesIntentExecutor salesIntentExecutor,
+                             AiSessionUserContext aiSessionUserContext,
+                             MongoChatMemoryStore mongoChatMemoryStore,
+                             AiChatSessionService aiChatSessionService) {
+        this.salesAgent = salesAgent;
+        this.salesIntentExecutor = salesIntentExecutor;
+        this.aiSessionUserContext = aiSessionUserContext;
+        this.mongoChatMemoryStore = mongoChatMemoryStore;
+        this.aiChatSessionService = aiChatSessionService;
+    }
+
+    @Operation(summary = "閿�鍞姪鎵嬪璇�")
+    @PostMapping(value = "/chat", produces = "text/stream;charset=utf-8")
+    public Flux<String> chat(@RequestBody ChatForm chatForm) {
+        if (!StringUtils.hasText(chatForm.getMemoryId())) {
+            return Flux.just("memoryId涓嶈兘涓虹┖");
+        }
+        if (!StringUtils.hasText(chatForm.getMessage())) {
+            return Flux.just("message涓嶈兘涓虹┖");
+        }
+
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        String memoryId = chatForm.getMemoryId();
+        String userMessage = chatForm.getMessage();
+
+        aiSessionUserContext.bind(memoryId, loginUser);
+        aiChatSessionService.touchSession(memoryId, loginUser, userMessage);
+
+        String directResponse = salesIntentExecutor.tryExecute(memoryId, userMessage);
+        if (StringUtils.isNotEmpty(directResponse)) {
+            mongoChatMemoryStore.appendMessages(
+                    memoryId,
+                    List.of(UserMessage.from(userMessage), AiMessage.from(directResponse))
+            );
+            aiChatSessionService.refreshSessionStats(memoryId, loginUser);
+            return Flux.just(directResponse);
+        }
+
+        if (isBusinessDataIntent(userMessage)) {
+            String noGuessResponse = "鏈瘑鍒埌鍙墽琛岀殑鏁版嵁鏌ヨ鏉′欢銆備负淇濊瘉缁撴灉鍑嗙‘锛屽綋鍓嶄笉浼氭帹娴嬫垨缂栭�犳暟鎹紝璇疯ˉ鍏呮槑纭椂闂磋寖鍥淬�佸鎴锋垨鍗曞彿鍚庡啀鏌ヨ銆�";
+            mongoChatMemoryStore.appendMessages(
+                    memoryId,
+                    List.of(UserMessage.from(userMessage), AiMessage.from(noGuessResponse))
+            );
+            aiChatSessionService.refreshSessionStats(memoryId, loginUser);
+            return Flux.just(noGuessResponse);
+        }
+
+        return salesAgent.chat(memoryId, userMessage, currentDateForPrompt())
+                .doOnComplete(() -> aiChatSessionService.refreshSessionStats(memoryId, loginUser))
+                .doOnError(ex -> aiChatSessionService.refreshSessionStats(memoryId, loginUser));
+    }
+
+    @Operation(summary = "閿�鍞姪鎵嬩細璇濆垪琛�")
+    @GetMapping("/history/sessions")
+    public R<?> listSessions() {
+        return R.ok(aiChatSessionService.listCurrentUserSessions(SecurityUtils.getLoginUser()));
+    }
+
+    @Operation(summary = "閿�鍞姪鎵嬩細璇濇秷鎭�")
+    @GetMapping("/history/messages/{memoryId}")
+    public R<?> listMessages(@PathVariable String memoryId) {
+        return R.ok(aiChatSessionService.listCurrentUserMessages(memoryId, SecurityUtils.getLoginUser()));
+    }
+
+    @Operation(summary = "鍒犻櫎閿�鍞姪鎵嬩細璇�")
+    @DeleteMapping("/history/{memoryId}")
+    public R<?> deleteSession(@PathVariable String memoryId) {
+        aiSessionUserContext.remove(memoryId);
+        aiChatSessionService.deleteCurrentUserSession(memoryId, SecurityUtils.getLoginUser());
+        return R.ok();
+    }
+
+    private boolean isBusinessDataIntent(String message) {
+        if (!StringUtils.hasText(message)) {
+            return false;
+        }
+        String text = message.trim();
+        return containsAny(text,
+                "鏌ヨ", "鏌ョ湅", "缁熻", "鍒嗘瀽", "寤鸿", "瀹㈡埛妗f", "绉佹捣", "鍏捣",
+                "閿�鍞姤浠�", "閿�鍞彴璐�", "閿�鍞��璐�", "瀹㈡埛寰�鏉�", "鍙戣揣鍙拌处", "鍥炴", "鎶ヤ环", "椋庨櫓");
+    }
+
+    private boolean containsAny(String text, String... keywords) {
+        for (String keyword : keywords) {
+            if (text.contains(keyword)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private String currentDateForPrompt() {
+        return LocalDate.now(CHINA_ZONE_ID).format(CURRENT_DATE_FMT);
+    }
+}
diff --git a/src/main/java/com/ruoyi/ai/controller/XiaozhiController.java b/src/main/java/com/ruoyi/ai/controller/XiaozhiController.java
index eac43b2..bf77339 100644
--- a/src/main/java/com/ruoyi/ai/controller/XiaozhiController.java
+++ b/src/main/java/com/ruoyi/ai/controller/XiaozhiController.java
@@ -12,23 +12,19 @@
 import com.ruoyi.common.utils.StringUtils;
 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;
 import dev.langchain4j.data.message.AiMessage;
 import dev.langchain4j.data.message.UserMessage;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import reactor.core.publisher.Flux;
 
 import java.io.IOException;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.UUID;
@@ -39,6 +35,8 @@
 public class XiaozhiController extends BaseController {
 
     private static final String FILE_ANALYZE_MEMORY_PREFIX = "file-analyze::";
+    private static final DateTimeFormatter CURRENT_DATE_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+    private static final ZoneId CHINA_ZONE_ID = ZoneId.of("Asia/Shanghai");
 
     private final ApproveTodoAgent approveTodoAgent;
     private final ApproveTodoIntentExecutor approveTodoIntentExecutor;
@@ -90,7 +88,17 @@
             return Flux.just(directResponse);
         }
 
-        return approveTodoAgent.chat(memoryId, userMessage)
+        if (isApproveTodoBusinessIntent(userMessage)) {
+            String noGuessResponse = "鏈瘑鍒埌鍙墽琛岀殑瀹℃壒寰呭姙鎿嶄綔鏉′欢銆備负淇濊瘉缁撴灉鍑嗙‘锛屽綋鍓嶄笉浼氭帹娴嬫垨缂栭�犲鎵规暟鎹紝璇疯ˉ鍏呮祦绋嬬紪鍙枫�佹椂闂磋寖鍥存垨鏄庣‘鎿嶄綔鎸囦护鍚庡啀璇曘��";
+            mongoChatMemoryStore.appendMessages(
+                    memoryId,
+                    List.of(UserMessage.from(userMessage), AiMessage.from(noGuessResponse))
+            );
+            aiChatSessionService.refreshSessionStats(memoryId, loginUser);
+            return Flux.just(noGuessResponse);
+        }
+
+        return approveTodoAgent.chat(memoryId, userMessage, currentDateForPrompt())
                 .doOnComplete(() -> aiChatSessionService.refreshSessionStats(memoryId, loginUser))
                 .doOnError(ex -> aiChatSessionService.refreshSessionStats(memoryId, loginUser));
     }
@@ -143,20 +151,45 @@
 
     @Operation(summary = "浼氳瘽鍒楄〃")
     @GetMapping("/history/sessions")
-    public AjaxResult listSessions() {
-        return success(aiChatSessionService.listCurrentUserSessions(SecurityUtils.getLoginUser()));
+    public R listSessions() {
+        return R.ok(aiChatSessionService.listCurrentUserSessions(SecurityUtils.getLoginUser()));
     }
 
     @Operation(summary = "浼氳瘽娑堟伅")
     @GetMapping("/history/messages/{memoryId}")
-    public AjaxResult listMessages(@PathVariable String memoryId) {
-        return success(aiChatSessionService.listCurrentUserMessages(memoryId, SecurityUtils.getLoginUser()));
+    public R listMessages(@PathVariable String memoryId) {
+        return R.ok(aiChatSessionService.listCurrentUserMessages(memoryId, SecurityUtils.getLoginUser()));
     }
 
     @Operation(summary = "鍒犻櫎浼氳瘽")
     @DeleteMapping("/history/{memoryId}")
-    public AjaxResult deleteSession(@PathVariable String memoryId) {
+    public R deleteSession(@PathVariable String memoryId) {
         aiSessionUserContext.remove(memoryId);
-        return toAjax(aiChatSessionService.deleteCurrentUserSession(memoryId, SecurityUtils.getLoginUser()));
+        return R.ok(aiChatSessionService.deleteCurrentUserSession(memoryId, SecurityUtils.getLoginUser()));
+    }
+
+    private boolean isApproveTodoBusinessIntent(String message) {
+        if (!StringUtils.hasText(message)) {
+            return false;
+        }
+        String text = message.trim();
+        boolean hasDomainWord = containsAny(text,
+                "瀹℃壒", "寰呭姙", "娴佺▼缂栧彿", "娴佺▼鍙�", "瀹℃壒娴佽浆", "瀹℃壒鑺傜偣", "褰撳墠瀹℃壒浜�", "椹冲洖", "閫氳繃", "鎾ら攢", "鍒犻櫎");
+        boolean hasIntentWord = containsAny(text,
+                "鏌ヨ", "鏌ョ湅", "鍒楀嚭", "缁熻", "鍒嗘瀽", "鍒嗗竷", "閫氳繃", "椹冲洖", "鎾ら攢", "鍒犻櫎", "淇敼", "鏈夊摢浜�", "鍗″湪");
+        return hasDomainWord && hasIntentWord;
+    }
+
+    private boolean containsAny(String text, String... keywords) {
+        for (String keyword : keywords) {
+            if (text.contains(keyword)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private String currentDateForPrompt() {
+        return LocalDate.now(CHINA_ZONE_ID).format(CURRENT_DATE_FMT);
     }
 }
diff --git a/src/main/java/com/ruoyi/ai/service/PurchaseAiService.java b/src/main/java/com/ruoyi/ai/service/PurchaseAiService.java
index 0f24d64..a4a0dc7 100644
--- a/src/main/java/com/ruoyi/ai/service/PurchaseAiService.java
+++ b/src/main/java/com/ruoyi/ai/service/PurchaseAiService.java
@@ -1,5 +1,6 @@
 package com.ruoyi.ai.service;
 
+import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -17,7 +18,7 @@
 import com.ruoyi.basic.service.StorageBlobService;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.framework.security.LoginUser;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.purchase.dto.PurchaseLedgerDto;
 import com.ruoyi.purchase.dto.PurchaseReturnOrderDto;
 import com.ruoyi.purchase.pojo.PaymentRegistration;
@@ -26,13 +27,7 @@
 import com.ruoyi.purchase.service.PurchaseReturnOrdersService;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import dev.langchain4j.data.image.Image;
-import dev.langchain4j.data.message.AiMessage;
-import dev.langchain4j.data.message.ChatMessage;
-import dev.langchain4j.data.message.Content;
-import dev.langchain4j.data.message.ImageContent;
-import dev.langchain4j.data.message.SystemMessage;
-import dev.langchain4j.data.message.TextContent;
-import dev.langchain4j.data.message.UserMessage;
+import dev.langchain4j.data.message.*;
 import dev.langchain4j.model.chat.StreamingChatLanguageModel;
 import dev.langchain4j.model.chat.response.ChatResponse;
 import dev.langchain4j.model.chat.response.StreamingChatResponseHandler;
@@ -47,22 +42,12 @@
 import java.io.InputStream;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.Base64;
-import java.util.Arrays;
+import java.nio.file.Files;
 import java.time.LocalDate;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeParseException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.UUID;
-import java.nio.file.Files;
+import java.util.*;
 
 @Service
 public class PurchaseAiService {
@@ -71,6 +56,8 @@
     private static final int MAX_FILE_COUNT = 10;
     private static final int MAX_SINGLE_FILE_TEXT_LENGTH = 8000;
     private static final int MAX_TOTAL_FILE_TEXT_LENGTH = 30000;
+    private static final DateTimeFormatter CURRENT_DATE_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+    private static final ZoneId CHINA_ZONE_ID = ZoneId.of("Asia/Shanghai");
 
     private final PurchaseAgent purchaseAgent;
     private final PurchaseIntentExecutor purchaseIntentExecutor;
@@ -138,7 +125,17 @@
             return Flux.just(directResponse);
         }
 
-        return purchaseAgent.chat(memoryId, userMessage)
+        if (isPurchaseBusinessIntent(userMessage)) {
+            String noGuessResponse = buildNoGuessResponse();
+            mongoChatMemoryStore.appendMessages(
+                    memoryId,
+                    List.of(UserMessage.from(userMessage), AiMessage.from(noGuessResponse))
+            );
+            aiChatSessionService.refreshSessionStats(memoryId, loginUser);
+            return Flux.just(noGuessResponse);
+        }
+
+        return purchaseAgent.chat(memoryId, userMessage, currentDateForPrompt())
                 .doOnComplete(() -> aiChatSessionService.refreshSessionStats(memoryId, loginUser))
                 .doOnError(ex -> aiChatSessionService.refreshSessionStats(memoryId, loginUser));
     }
@@ -200,21 +197,21 @@
                     .doOnError(ex -> aiChatSessionService.refreshSessionStats(finalMemoryId, loginUser));
         }
 
-        return Flux.defer(() -> purchaseAgent.chat(finalMemoryId, userPrompt))
+        return Flux.defer(() -> purchaseAgent.chat(finalMemoryId, userPrompt, currentDateForPrompt()))
                 .onErrorResume(NoSuchElementException.class, ex -> {
                     mongoChatMemoryStore.deleteMessages(finalMemoryId);
-                    return purchaseAgent.chat(finalMemoryId, userPrompt);
+                    return purchaseAgent.chat(finalMemoryId, userPrompt, currentDateForPrompt());
                 })
                 .doOnComplete(() -> aiChatSessionService.refreshSessionStats(finalMemoryId, loginUser))
                 .doOnError(ex -> aiChatSessionService.refreshSessionStats(finalMemoryId, loginUser));
     }
 
-    public AjaxResult confirmAnalyzeResult(PurchaseAiConfirmRequest request) {
+    public R confirmAnalyzeResult(PurchaseAiConfirmRequest request) {
         if (request == null || !StringUtils.hasText(request.getBusinessType())) {
-            return AjaxResult.error("businessType涓嶈兘涓虹┖");
+            return R.fail("businessType涓嶈兘涓虹┖");
         }
         if (request.getPayload() == null || request.getPayload().isEmpty()) {
-            return AjaxResult.error("payload涓嶈兘涓虹┖");
+            return R.fail("payload涓嶈兘涓虹┖");
         }
 
         try {
@@ -223,10 +220,10 @@
                 case "purchase_ledger" -> processPurchaseLedger(request.getPayload());
                 case "payment_registration" -> processPaymentRegistration(request.getPayload());
                 case "purchase_return_order" -> processPurchaseReturnOrder(request.getPayload());
-                default -> AjaxResult.error("鏆備笉鏀寔璇ヤ笟鍔$被鍨�: " + businessType);
+                default -> R.fail("鏆備笉鏀寔璇ヤ笟鍔$被鍨�: " + businessType);
             };
         } catch (Exception ex) {
-            return AjaxResult.error(toCustomerMessage(ex));
+            return R.fail(toCustomerMessage(ex));
         }
     }
 
@@ -471,6 +468,51 @@
         };
     }
 
+    private String currentDateForPrompt() {
+        return LocalDate.now(CHINA_ZONE_ID).format(CURRENT_DATE_FMT);
+    }
+
+    private boolean isPurchaseBusinessIntent(String message) {
+        if (!StringUtils.hasText(message)) {
+            return false;
+        }
+        String text = message.trim();
+        boolean hasDomainWord = containsAny(text,
+                "閲囪喘", "閲囪喘鍙拌处", "閲囪喘鍗�", "閲囪喘璁㈠崟", "渚涘簲鍟�", "鐗╂枡", "鍏ュ簱", "鍒拌揣", "寰呬粯娆�",
+                "浠樻", "閫�璐�", "閫�鏂�", "鍙戠エ", "鍚堝悓");
+        boolean hasIntentWord = containsAny(text,
+                "鏌ヨ", "鏌ョ湅", "缁熻", "鍒嗘瀽", "鎺掕", "鎺掑悕", "鍒楀嚭", "鏈夊摢浜�", "鎯呭喌", "鏄庣粏", "璇︽儏", "鎶ヨ〃");
+        return hasDomainWord && hasIntentWord;
+    }
+
+    private boolean containsAny(String text, String... keywords) {
+        for (String keyword : keywords) {
+            if (text.contains(keyword)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private String buildNoGuessResponse() {
+        Map<String, Object> result = new LinkedHashMap<>();
+        result.put("success", false);
+        result.put("type", "purchase_intent_not_recognized");
+        result.put("description", "鏈瘑鍒埌鍙墽琛岀殑閲囪喘鏌ヨ鏉′欢銆備负淇濊瘉缁撴灉鍑嗙‘锛屽綋鍓嶄笉浼氭帹娴嬫垨缂栭�犳暟鎹紝璇疯ˉ鍏呮槑纭椂闂磋寖鍥淬�佷緵搴斿晢銆侀噰璐悎鍚屽彿鎴栫墿鏂欏悗鍐嶆煡璇€��");
+        result.put("summary", Map.of());
+        result.put("data", Map.of(
+                "quickPrompts", List.of(
+                        "鏈湀閲囪喘閲戦鎺掑悕鍓嶅崄鐨勭墿鏂欐湁鍝簺锛�",
+                        "鍝簺閲囪喘璁㈠崟杩樻湭鍏ュ簱锛�",
+                        "鏈�杩�7澶╀緵搴斿晢鍒拌揣寮傚父鏈夊摢浜涳紵",
+                        "甯垜缁熻寰呬粯娆鹃噰璐崟锛�",
+                        "鍒楀嚭鏈湀閲囪喘閫�璐ф儏鍐�"
+                )
+        ));
+        result.put("charts", Map.of());
+        return JSON.toJSONString(result);
+    }
+
     private String buildPurchaseFileAnalyzePrompt(String message, String fileContent) {
         return """
                 浣犳槸閲囪喘涓氬姟鏂囦欢鍒嗘瀽鍔╂墜銆傝涓ユ牸鏍规嵁鐢ㄦ埛涓婁紶鐨勫涓枃浠跺拰鐢ㄦ埛瑕佹眰鎻愬彇閲囪喘涓氬姟鏁版嵁銆�
@@ -481,7 +523,7 @@
                 杈撳嚭瑕佹眰:
                 1. 鍙緭鍑哄悎娉� JSON锛屼笉瑕� Markdown锛屼笉瑕侀澶栬В閲娿��
                 2. JSON 椤跺眰瀛楁鍥哄畾涓�:
-                   - success: boolean
+                   - ok: boolean
                    - businessType: purchase_ledger | payment_registration | purchase_return_order | unknown
                    - action: confirm_required
                    - description: 涓枃璇存槑
@@ -517,33 +559,33 @@
                 """.formatted(message, fileContent);
     }
 
-    private AjaxResult processPurchaseLedger(Map<String, Object> payload) throws Exception {
+    private R processPurchaseLedger(Map<String, Object> payload) throws Exception {
         if (payload.containsKey("purchaseLedgers")) {
             return processPurchaseLedgerBatch(payload);
         }
 
         Map<String, Object> normalizedPayload = normalizePurchaseLedgerMap(payload);
         PurchaseLedgerDto dto = objectMapper.convertValue(normalizedPayload, PurchaseLedgerDto.class);
-        AjaxResult ledgerResult = validatePurchaseLedger(dto, 0);
+        R ledgerResult = validatePurchaseLedger(dto, 0);
         if (ledgerResult != null) {
             return ledgerResult;
         }
-        AjaxResult supplierResult = fillSupplierIdByName(dto);
+        R supplierResult = fillSupplierIdByName(dto);
         if (supplierResult != null) {
             return supplierResult;
         }
-        AjaxResult productResult = validatePurchaseProducts(dto.getProductData(), 0);
+        R productResult = validatePurchaseProducts(dto.getProductData(), 0);
         if (productResult != null) {
             return productResult;
         }
         int result = purchaseLedgerService.addOrEditPurchase(dto);
-        return AjaxResult.success("閲囪喘鍙拌处宸插鐞�", result);
+        return R.ok( result,"閲囪喘鍙拌处宸插鐞�");
     }
 
-    private AjaxResult processPurchaseLedgerBatch(Map<String, Object> payload) throws Exception {
+    private R processPurchaseLedgerBatch(Map<String, Object> payload) throws Exception {
         List<Map<String, Object>> purchaseLedgers = toMapList(payload.get("purchaseLedgers"));
         if (purchaseLedgers.isEmpty()) {
-            return AjaxResult.error("purchaseLedgers涓嶈兘涓虹┖");
+            return R.fail("purchaseLedgers涓嶈兘涓虹┖");
         }
 
         List<Map<String, Object>> topLevelProductData = toMapList(payload.get("productData"));
@@ -551,11 +593,11 @@
         for (int i = 0; i < purchaseLedgers.size(); i++) {
             Map<String, Object> ledgerMap = normalizePurchaseLedgerMap(purchaseLedgers.get(i));
             PurchaseLedgerDto dto = objectMapper.convertValue(ledgerMap, PurchaseLedgerDto.class);
-            AjaxResult ledgerResult = validatePurchaseLedger(dto, i);
+            R ledgerResult = validatePurchaseLedger(dto, i);
             if (ledgerResult != null) {
                 return ledgerResult;
             }
-            AjaxResult supplierResult = fillSupplierIdByName(dto);
+            R supplierResult = fillSupplierIdByName(dto);
             if (supplierResult != null) {
                 return supplierResult;
             }
@@ -565,7 +607,7 @@
                 products = matchProductsForLedger(ledgerMap, dto, topLevelProductData, purchaseLedgers.size() == 1);
                 dto.setProductData(products);
             }
-            AjaxResult productResult = validatePurchaseProducts(products, i);
+            R productResult = validatePurchaseProducts(products, i);
             if (productResult != null) {
                 return productResult;
             }
@@ -580,7 +622,7 @@
             item.put("result", result);
             results.add(item);
         }
-        return AjaxResult.success("閲囪喘鍙拌处宸叉壒閲忓鐞�", results);
+        return R.ok( results,"閲囪喘鍙拌处宸叉壒閲忓鐞�");
     }
 
     private List<SalesLedgerProduct> matchProductsForLedger(Map<String, Object> ledgerMap,
@@ -786,7 +828,7 @@
         }
     }
 
-    private AjaxResult validatePurchaseProducts(List<SalesLedgerProduct> products, int ledgerIndex) {
+    private R validatePurchaseProducts(List<SalesLedgerProduct> products, int ledgerIndex) {
         if (products == null || products.isEmpty()) {
             return null;
         }
@@ -794,34 +836,34 @@
             SalesLedgerProduct product = products.get(i);
             String prefix = "绗�" + (ledgerIndex + 1) + "涓噰璐彴璐︾殑绗�" + (i + 1) + "鏉′骇鍝�";
             if (!StringUtils.hasText(product.getProductCategory())) {
-                return AjaxResult.error(prefix + "缂哄皯浜у搧鍚嶇О锛岃琛ュ厖鍚庡啀纭");
+                return R.fail(prefix + "缂哄皯浜у搧鍚嶇О锛岃琛ュ厖鍚庡啀纭");
             }
             if (!StringUtils.hasText(product.getSpecificationModel())) {
-                return AjaxResult.error(prefix + "缂哄皯瑙勬牸鍨嬪彿锛岃琛ュ厖鍚庡啀纭");
+                return R.fail(prefix + "缂哄皯瑙勬牸鍨嬪彿锛岃琛ュ厖鍚庡啀纭");
             }
             if (!StringUtils.hasText(product.getUnit())) {
-                return AjaxResult.error(prefix + "缂哄皯鍗曚綅锛岃琛ュ厖鍚庡啀纭");
+                return R.fail(prefix + "缂哄皯鍗曚綅锛岃琛ュ厖鍚庡啀纭");
             }
             if (product.getQuantity() == null) {
-                return AjaxResult.error(prefix + "缂哄皯鏁伴噺");
+                return R.fail(prefix + "缂哄皯鏁伴噺");
             }
             if (product.getTaxInclusiveUnitPrice() == null) {
-                return AjaxResult.error(prefix + "缂哄皯鍚◣鍗曚环锛岃琛ュ厖鍚庡啀纭");
+                return R.fail(prefix + "缂哄皯鍚◣鍗曚环锛岃琛ュ厖鍚庡啀纭");
             }
             if (product.getTaxInclusiveTotalPrice() == null) {
-                return AjaxResult.error(prefix + "缂哄皯鍚◣鎬讳环锛岃琛ュ厖鍚庡啀纭");
+                return R.fail(prefix + "缂哄皯鍚◣鎬讳环锛岃琛ュ厖鍚庡啀纭");
             }
         }
         return null;
     }
 
-    private AjaxResult validatePurchaseLedger(PurchaseLedgerDto dto, int ledgerIndex) {
+    private R validatePurchaseLedger(PurchaseLedgerDto dto, int ledgerIndex) {
         String prefix = "绗�" + (ledgerIndex + 1) + "涓噰璐彴璐�";
         if (!StringUtils.hasText(dto.getPurchaseContractNumber())) {
-            return AjaxResult.error(prefix + "缂哄皯閲囪喘鍚堝悓鍙凤紝璇疯ˉ鍏呭悗鍐嶇‘璁�");
+            return R.fail(prefix + "缂哄皯閲囪喘鍚堝悓鍙凤紝璇疯ˉ鍏呭悗鍐嶇‘璁�");
         }
         if (dto.getSupplierId() == null && !StringUtils.hasText(dto.getSupplierName())) {
-            return AjaxResult.error(prefix + "缂哄皯渚涘簲鍟嗗悕绉帮紝璇疯ˉ鍏呭悗鍐嶇‘璁�");
+            return R.fail(prefix + "缂哄皯渚涘簲鍟嗗悕绉帮紝璇疯ˉ鍏呭悗鍐嶇‘璁�");
         }
         return null;
     }
@@ -992,25 +1034,25 @@
         return "澶勭悊澶辫触锛�" + message;
     }
 
-    private AjaxResult fillSupplierIdByName(PurchaseLedgerDto dto) {
+    private R fillSupplierIdByName(PurchaseLedgerDto dto) {
         if (dto.getSupplierId() != null) {
             return null;
         }
         if (!StringUtils.hasText(dto.getSupplierName())) {
-            return AjaxResult.error("渚涘簲鍟咺D涓嶈兘涓虹┖锛涙湭璇嗗埆鍒颁緵搴斿晢鍚嶇О锛屾棤娉曡嚜鍔ㄥ尮閰嶄緵搴斿晢ID");
+            return R.fail("渚涘簲鍟咺D涓嶈兘涓虹┖锛涙湭璇嗗埆鍒颁緵搴斿晢鍚嶇О锛屾棤娉曡嚜鍔ㄥ尮閰嶄緵搴斿晢ID");
         }
 
         SupplierManage supplier = supplierManageMapper.selectOne(new LambdaQueryWrapper<SupplierManage>()
                 .eq(SupplierManage::getSupplierName, dto.getSupplierName().trim())
                 .last("limit 1"));
         if (supplier == null) {
-            return AjaxResult.error("鏈壘鍒颁緵搴斿晢锛�" + dto.getSupplierName() + "锛岃鍏堢淮鎶や緵搴斿晢鎴栨墜鍔ㄩ�夋嫨渚涘簲鍟咺D");
+            return R.fail("鏈壘鍒颁緵搴斿晢锛�" + dto.getSupplierName() + "锛岃鍏堢淮鎶や緵搴斿晢鎴栨墜鍔ㄩ�夋嫨渚涘簲鍟咺D");
         }
         dto.setSupplierId(supplier.getId());
         return null;
     }
 
-    private AjaxResult processPaymentRegistration(Map<String, Object> payload) {
+    private R processPaymentRegistration(Map<String, Object> payload) {
         Object recordsValue = payload.get("records");
         List<PaymentRegistration> records;
         if (recordsValue == null) {
@@ -1020,12 +1062,12 @@
             });
         }
         int result = paymentRegistrationService.insertPaymentRegistration(records);
-        return AjaxResult.success("浠樻鐧昏宸插鐞�", result);
+        return R.ok( result,"浠樻鐧昏宸插鐞�");
     }
 
-    private AjaxResult processPurchaseReturnOrder(Map<String, Object> payload) {
+    private R processPurchaseReturnOrder(Map<String, Object> payload) {
         PurchaseReturnOrderDto dto = objectMapper.convertValue(payload, PurchaseReturnOrderDto.class);
         Boolean result = purchaseReturnOrdersService.add(dto);
-        return AjaxResult.success("閲囪喘閫�璐у崟宸插鐞�", result);
+        return R.ok( result,"閲囪喘閫�璐у崟宸插鐞�");
     }
 }
diff --git a/src/main/java/com/ruoyi/ai/tools/ApproveTodoTools.java b/src/main/java/com/ruoyi/ai/tools/ApproveTodoTools.java
index cd3e933..fec0c21 100644
--- a/src/main/java/com/ruoyi/ai/tools/ApproveTodoTools.java
+++ b/src/main/java/com/ruoyi/ai/tools/ApproveTodoTools.java
@@ -76,12 +76,17 @@
                             @P(value = "瀹℃壒绫诲瀷缂栧彿锛屽彲涓嶄紶", required = false) Integer approveType,
                             @P(value = "鍏抽敭瀛楋紝鍙尮閰嶆祦绋嬬紪鍙枫�佹爣棰樸�佺敵璇蜂汉銆佸綋鍓嶅鎵逛汉", required = false) String keyword,
                             @P(value = "杩斿洖鏉℃暟锛岄粯璁�10锛屾渶澶�20", required = false) Integer limit,
-                            @P(value = "鏌ヨ鑼冨洿锛屽彲閫夊�硷細related銆乤pplicant銆乤pprover锛況elated 琛ㄧず褰撳墠鐢ㄦ埛鐩稿叧锛宎pplicant 琛ㄧず鎴戝彂璧风殑锛宎pprover 琛ㄧず寰呮垜澶勭悊鐨�", required = false) String scope) {
+                            @P(value = "鏌ヨ鑼冨洿锛屽彲閫夊�硷細related銆乤pplicant銆乤pprover锛況elated 琛ㄧず褰撳墠鐢ㄦ埛鐩稿叧锛宎pplicant 琛ㄧず鎴戝彂璧风殑锛宎pprover 琛ㄧず寰呮垜澶勭悊鐨�", required = false) String scope,
+                            @P(value = "寮�濮嬫棩鏈� yyyy-MM-dd锛屽彲涓嶄紶", required = false) String startDate,
+                            @P(value = "缁撴潫鏃ユ湡 yyyy-MM-dd锛屽彲涓嶄紶", required = false) String endDate,
+                            @P(value = "鏃堕棿鑼冨洿鎻忚堪锛屼緥濡� 浠婂ぉ銆佹湰鏈堛�佽繎30澶╋紝鍙笉浼�", required = false) String timeRange) {
 
         LoginUser loginUser = currentLoginUser(memoryId);
         Long userId = loginUser.getUserId();
         Integer statusCode = parseStatus(status);
         String normalizedScope = normalizeScope(scope);
+        boolean hasDateFilter = StringUtils.hasText(startDate) || StringUtils.hasText(endDate) || StringUtils.hasText(timeRange);
+        DateRange dateRange = hasDateFilter ? resolveDateRange(startDate, endDate, timeRange) : null;
 
         LambdaQueryWrapper<ApproveProcess> wrapper = new LambdaQueryWrapper<>();
         wrapper.eq(ApproveProcess::getApproveDelete, 0);
@@ -120,6 +125,11 @@
             }
         }
 
+        if (dateRange != null) {
+            wrapper.ge(ApproveProcess::getCreateTime, dateRange.start().atStartOfDay())
+                    .lt(ApproveProcess::getCreateTime, dateRange.end().plusDays(1).atStartOfDay());
+        }
+
         wrapper.orderByDesc(ApproveProcess::getCreateTime)
                 .last("limit " + normalizeLimit(limit));
 
@@ -156,7 +166,10 @@
                         "statusFilter", StringUtils.hasText(status) ? status : "all",
                         "approveType", approveType == null ? "" : approveType,
                         "keyword", keyword == null ? "" : keyword,
-                        "scope", normalizedScope
+                        "scope", normalizedScope,
+                        "timeRange", dateRange == null ? "all" : dateRange.label(),
+                        "startDate", dateRange == null ? "" : dateRange.start().toString(),
+                        "endDate", dateRange == null ? "" : dateRange.end().toString()
                 ),
                 Map.of("columns", todoColumns(), "items", items),
                 Map.of());
diff --git a/src/main/java/com/ruoyi/ai/tools/PurchaseAgentTools.java b/src/main/java/com/ruoyi/ai/tools/PurchaseAgentTools.java
index 17b6868..2ec6003 100644
--- a/src/main/java/com/ruoyi/ai/tools/PurchaseAgentTools.java
+++ b/src/main/java/com/ruoyi/ai/tools/PurchaseAgentTools.java
@@ -42,6 +42,7 @@
 public class PurchaseAgentTools {
 
     private static final DateTimeFormatter DATE_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+    private static final ZoneId CHINA_ZONE_ID = ZoneId.of("Asia/Shanghai");
     private static final int DEFAULT_LIMIT = 10;
     private static final int MAX_LIMIT = 30;
 
@@ -286,8 +287,24 @@
                 .sorted(Comparator.comparing(item -> (BigDecimal) item.get("pendingAmount"), Comparator.reverseOrder()))
                 .limit(normalizeLimit(limit))
                 .collect(Collectors.toList());
+
+        BigDecimal totalContractAmount = items.stream()
+                .map(item -> asBigDecimal(item.get("contractAmount")))
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        BigDecimal totalPaidAmount = items.stream()
+                .map(item -> asBigDecimal(item.get("paidAmount")))
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        BigDecimal totalPendingAmount = items.stream()
+                .map(item -> asBigDecimal(item.get("pendingAmount")))
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        Map<String, Object> summary = rangeSummary(range, items.size());
+        summary.put("pendingOrderCount", items.size());
+        summary.put("totalContractAmount", totalContractAmount);
+        summary.put("totalPaidAmount", totalPaidAmount);
+        summary.put("totalPendingAmount", totalPendingAmount);
+
         return jsonResponse(true, "purchase_pending_payment_list", "宸茶繑鍥炲緟浠樻閲囪喘鍗曘��",
-                rangeSummary(range, items.size()), Map.of("items", items), Map.of());
+                summary, Map.of("items", items), Map.of());
     }
 
     @Tool(name = "鏌ヨ閲囪喘閫�璐ф儏鍐�", value = "鎸夋椂闂磋寖鍥存煡璇㈤噰璐��璐у崟鍒楄〃鍜岄��璐ч噾棰濄��")
@@ -446,6 +463,19 @@
         return value == null ? BigDecimal.ZERO : value;
     }
 
+    private BigDecimal asBigDecimal(Object value) {
+        if (value == null) {
+            return BigDecimal.ZERO;
+        }
+        if (value instanceof BigDecimal decimal) {
+            return decimal;
+        }
+        if (value instanceof Number number) {
+            return new BigDecimal(String.valueOf(number));
+        }
+        return BigDecimal.ZERO;
+    }
+
     private List<PaymentRegistration> queryPayments(LoginUser loginUser, DateRange range) {
         LambdaQueryWrapper<PaymentRegistration> wrapper = new LambdaQueryWrapper<>();
         applyTenantFilter(wrapper, loginUser.getTenantId(), PaymentRegistration::getTenantId);
@@ -484,7 +514,7 @@
     }
 
     private DateRange resolveDateRange(String startDate, String endDate, String timeRange) {
-        LocalDate today = LocalDate.now();
+        LocalDate today = LocalDate.now(CHINA_ZONE_ID);
         LocalDate start = parseLocalDate(startDate);
         LocalDate end = parseLocalDate(endDate);
         if (start != null || end != null) {
@@ -501,6 +531,22 @@
             return new DateRange(today.minusDays(29), today, "杩�30澶�");
         }
         String text = timeRange.trim();
+        if (text.contains("浠婂ぉ")) {
+            return new DateRange(today, today, "浠婂ぉ");
+        }
+        if (text.contains("鏄ㄥぉ")) {
+            LocalDate yesterday = today.minusDays(1);
+            return new DateRange(yesterday, yesterday, "鏄ㄥぉ");
+        }
+        if (text.contains("鏈懆")) {
+            LocalDate startOfWeek = today.minusDays(today.getDayOfWeek().getValue() - 1L);
+            return new DateRange(startOfWeek, today, "鏈懆");
+        }
+        if (text.contains("涓婂懆")) {
+            LocalDate thisWeekStart = today.minusDays(today.getDayOfWeek().getValue() - 1L);
+            LocalDate startOfLastWeek = thisWeekStart.minusWeeks(1);
+            return new DateRange(startOfLastWeek, startOfLastWeek.plusDays(6), "涓婂懆");
+        }
         if (text.contains("浠婂勾") || text.contains("鏈勾")) {
             return new DateRange(today.withDayOfYear(1), today, "浠婂勾");
         }
@@ -538,7 +584,11 @@
         if (!StringUtils.hasText(text)) {
             return null;
         }
-        return LocalDate.parse(text.trim(), DATE_FMT);
+        try {
+            return LocalDate.parse(text.trim(), DATE_FMT);
+        } catch (Exception ignored) {
+            return null;
+        }
     }
 
     private Date toDate(LocalDate localDate) {
diff --git a/src/main/java/com/ruoyi/ai/tools/SalesAgentTools.java b/src/main/java/com/ruoyi/ai/tools/SalesAgentTools.java
new file mode 100644
index 0000000..b56144b
--- /dev/null
+++ b/src/main/java/com/ruoyi/ai/tools/SalesAgentTools.java
@@ -0,0 +1,1475 @@
+package com.ruoyi.ai.tools;
+
+import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import com.ruoyi.account.mapper.SalesReceiptReturnMapper;
+import com.ruoyi.account.pojo.SalesReceiptReturn;
+import com.ruoyi.ai.context.AiSessionUserContext;
+import com.ruoyi.basic.dto.CustomerDto;
+import com.ruoyi.basic.mapper.CustomerMapper;
+import com.ruoyi.basic.vo.CustomerVo;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.security.LoginUser;
+import com.ruoyi.sales.dto.InvoiceLedgerDto;
+import com.ruoyi.sales.mapper.InvoiceLedgerMapper;
+import com.ruoyi.sales.mapper.ReceiptPaymentMapper;
+import com.ruoyi.sales.mapper.SalesLedgerMapper;
+import com.ruoyi.sales.mapper.SalesQuotationMapper;
+import com.ruoyi.sales.mapper.ShippingInfoMapper;
+import com.ruoyi.sales.pojo.ReceiptPayment;
+import com.ruoyi.sales.pojo.SalesLedger;
+import com.ruoyi.sales.pojo.SalesQuotation;
+import com.ruoyi.sales.pojo.ShippingInfo;
+import dev.langchain4j.agent.tool.P;
+import dev.langchain4j.agent.tool.Tool;
+import dev.langchain4j.agent.tool.ToolMemoryId;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.YearMonth;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Objects;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+@Component
+public class SalesAgentTools {
+
+    private static final DateTimeFormatter DATE_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+    private static final int DEFAULT_LIMIT = 10;
+    private static final int MAX_LIMIT = 30;
+    private static final BigDecimal ONE_HUNDRED = new BigDecimal("100");
+    private static final Pattern RELATIVE_PATTERN = Pattern.compile("(杩憒鏈�杩�)?\\s*(\\d+)\\s*(澶﹟鍛▅涓湀|鏈坾骞�)");
+    private static final Pattern DATE_PATTERN = Pattern.compile("(\\d{4}-\\d{2}-\\d{2})");
+
+    private final CustomerMapper customerMapper;
+    private final SalesLedgerMapper salesLedgerMapper;
+    private final SalesQuotationMapper salesQuotationMapper;
+    private final ShippingInfoMapper shippingInfoMapper;
+    private final ReceiptPaymentMapper receiptPaymentMapper;
+    private final InvoiceLedgerMapper invoiceLedgerMapper;
+    private final SalesReceiptReturnMapper salesReceiptReturnMapper;
+    private final AiSessionUserContext aiSessionUserContext;
+
+    public SalesAgentTools(CustomerMapper customerMapper,
+                           SalesLedgerMapper salesLedgerMapper,
+                           SalesQuotationMapper salesQuotationMapper,
+                           ShippingInfoMapper shippingInfoMapper,
+                           ReceiptPaymentMapper receiptPaymentMapper,
+                           InvoiceLedgerMapper invoiceLedgerMapper,
+                           SalesReceiptReturnMapper salesReceiptReturnMapper,
+                           AiSessionUserContext aiSessionUserContext) {
+        this.customerMapper = customerMapper;
+        this.salesLedgerMapper = salesLedgerMapper;
+        this.salesQuotationMapper = salesQuotationMapper;
+        this.shippingInfoMapper = shippingInfoMapper;
+        this.receiptPaymentMapper = receiptPaymentMapper;
+        this.invoiceLedgerMapper = invoiceLedgerMapper;
+        this.salesReceiptReturnMapper = salesReceiptReturnMapper;
+        this.aiSessionUserContext = aiSessionUserContext;
+    }
+
+    @Tool(name = "鏌ヨ瀹㈡埛妗f", value = "鎸夌娴�/鍏捣绫诲瀷鍜屽叧閿瘝鏌ヨ瀹㈡埛妗f鍒楄〃")
+    public String listCustomerProfiles(@ToolMemoryId String memoryId,
+                                       @P(value = "瀹㈡埛姹犵被鍨嬶紝鍙�� private/public", required = false) String seaType,
+                                       @P(value = "鍏抽敭璇嶏紝鍙尮閰嶅鎴峰悕绉�/鑱旂郴浜�/鐢佃瘽", required = false) String keyword,
+                                       @P(value = "杩斿洖鏉℃暟锛岄粯璁�10锛屾渶澶�30", required = false) Integer limit) {
+        LoginUser loginUser = currentLoginUser(memoryId);
+        CustomerDto customerDto = new CustomerDto();
+        customerDto.setType(normalizeSeaType(seaType));
+        customerDto.setUsageStatus(1L);
+
+        List<CustomerVo> rows = defaultList(customerMapper.list(customerDto, loginUser.getUserId()));
+        List<CustomerVo> filtered = rows.stream()
+                .filter(item -> matchCustomerKeyword(item, keyword))
+                .sorted(Comparator.comparing(CustomerVo::getId, Comparator.nullsLast(Comparator.reverseOrder())))
+                .limit(normalizeLimit(limit))
+                .collect(Collectors.toList());
+
+        List<Map<String, Object>> items = filtered.stream().map(item -> {
+            Map<String, Object> map = new LinkedHashMap<>();
+            map.put("id", item.getId());
+            map.put("customerName", safe(item.getCustomerName()));
+            map.put("customerType", safe(item.getCustomerType()));
+            map.put("contactPerson", safe(item.getContactPerson()));
+            map.put("contactPhone", safe(item.getContactPhone()));
+            map.put("companyPhone", safe(item.getCompanyPhone()));
+            map.put("maintainer", safe(item.getMaintainer()));
+            map.put("maintenanceTime", formatDate(item.getMaintenanceTime()));
+            map.put("usageUserName", safe(item.getUsageUserName()));
+            map.put("seaType", customerSeaTypeName(item.getType()));
+            map.put("isAssigned", item.getIsAssigned());
+            return map;
+        }).collect(Collectors.toList());
+
+        Map<String, Object> summary = new LinkedHashMap<>();
+        summary.put("count", items.size());
+        summary.put("seaType", seaType == null ? "all" : seaType);
+        summary.put("keyword", safe(keyword));
+        summary.put("userId", loginUser.getUserId());
+
+        return jsonResponse(true, "sales_customer_profile_list", "宸茶繑鍥炲鎴锋。妗堝垪琛�", summary, Map.of("items", items), Map.of());
+    }
+
+    @Tool(name = "鏌ヨ閿�鍞姤浠�", value = "鎸夊叧閿瘝鍜屾椂闂磋寖鍥存煡璇㈤攢鍞姤浠峰崟")
+    public String listSalesQuotations(@ToolMemoryId String memoryId,
+                                      @P(value = "鍏抽敭璇嶏紝鍙尮閰嶆姤浠峰崟鍙�/瀹㈡埛/涓氬姟鍛�/鐘舵��", required = false) String keyword,
+                                      @P(value = "寮�濮嬫棩鏈� yyyy-MM-dd", required = false) String startDate,
+                                      @P(value = "缁撴潫鏃ユ湡 yyyy-MM-dd", required = false) String endDate,
+                                      @P(value = "杩斿洖鏉℃暟锛岄粯璁�10锛屾渶澶�30", required = false) Integer limit) {
+        LoginUser loginUser = currentLoginUser(memoryId);
+        DateRange range = resolveDateRange(startDate, endDate, null);
+        LambdaQueryWrapper<SalesQuotation> wrapper = new LambdaQueryWrapper<>();
+        applyTenantFilter(wrapper, loginUser.getTenantId(), SalesQuotation::getTenantId);
+        applyDeptFilter(wrapper, loginUser.getCurrentDeptId(), SalesQuotation::getDeptId);
+        if (StringUtils.hasText(keyword)) {
+            wrapper.and(w -> w.like(SalesQuotation::getQuotationNo, keyword)
+                    .or().like(SalesQuotation::getCustomer, keyword)
+                    .or().like(SalesQuotation::getSalesperson, keyword)
+                    .or().like(SalesQuotation::getStatus, keyword));
+        }
+        wrapper.ge(SalesQuotation::getQuotationDate, range.start())
+                .le(SalesQuotation::getQuotationDate, range.end())
+                .orderByDesc(SalesQuotation::getQuotationDate, SalesQuotation::getId)
+                .last("limit " + normalizeLimit(limit));
+
+        List<SalesQuotation> rows = defaultList(salesQuotationMapper.selectList(wrapper));
+        BigDecimal quotationAmountTotal = rows.stream()
+                .map(SalesQuotation::getTotalAmount)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        List<Map<String, Object>> items = rows.stream().map(item -> {
+            Map<String, Object> map = new LinkedHashMap<>();
+            map.put("id", item.getId());
+            map.put("quotationNo", safe(item.getQuotationNo()));
+            map.put("customer", safe(item.getCustomer()));
+            map.put("salesperson", safe(item.getSalesperson()));
+            map.put("quotationDate", formatDate(item.getQuotationDate()));
+            map.put("validDate", formatDate(item.getValidDate()));
+            map.put("status", safe(item.getStatus()));
+            map.put("paymentMethod", safe(item.getPaymentMethod()));
+            map.put("deliveryPeriod", safe(item.getDeliveryPeriod()));
+            map.put("totalAmount", item.getTotalAmount());
+            return map;
+        }).collect(Collectors.toList());
+
+        Map<String, Object> summary = rangeSummary(range, items.size(), keyword);
+        summary.put("quotationAmountTotal", quotationAmountTotal);
+        return jsonResponse(true, "sales_quotation_list", "宸茶繑鍥為攢鍞姤浠峰垪琛�", summary, Map.of("items", items), Map.of());
+    }
+
+    @Tool(name = "鏌ヨ閿�鍞彴璐�", value = "鎸夊叧閿瘝鍜屾椂闂磋寖鍥存煡璇㈤攢鍞彴璐︼紝骞惰繑鍥炲紑绁ㄥ洖娆句笌鍙戣揣鐘舵��")
+    public String listSalesLedgers(@ToolMemoryId String memoryId,
+                                   @P(value = "鍏抽敭璇嶏紝鍙尮閰嶉攢鍞悎鍚屽彿/瀹㈡埛鍚堝悓鍙�/瀹㈡埛/椤圭洰", required = false) String keyword,
+                                   @P(value = "寮�濮嬫棩鏈� yyyy-MM-dd", required = false) String startDate,
+                                   @P(value = "缁撴潫鏃ユ湡 yyyy-MM-dd", required = false) String endDate,
+                                   @P(value = "杩斿洖鏉℃暟锛岄粯璁�10锛屾渶澶�30", required = false) Integer limit) {
+        LoginUser loginUser = currentLoginUser(memoryId);
+        DateRange range = resolveDateRange(startDate, endDate, null);
+        LambdaQueryWrapper<SalesLedger> wrapper = new LambdaQueryWrapper<>();
+        applyTenantFilter(wrapper, loginUser.getTenantId(), SalesLedger::getTenantId);
+        applyDeptFilter(wrapper, loginUser.getCurrentDeptId(), SalesLedger::getDeptId);
+        if (StringUtils.hasText(keyword)) {
+            wrapper.and(w -> w.like(SalesLedger::getSalesContractNo, keyword)
+                    .or().like(SalesLedger::getCustomerContractNo, keyword)
+                    .or().like(SalesLedger::getCustomerName, keyword)
+                    .or().like(SalesLedger::getProjectName, keyword)
+                    .or().like(SalesLedger::getSalesman, keyword));
+        }
+        wrapper.ge(SalesLedger::getEntryDate, toDate(range.start()))
+                .lt(SalesLedger::getEntryDate, toExclusiveEndDate(range.end()))
+                .orderByDesc(SalesLedger::getEntryDate, SalesLedger::getId)
+                .last("limit " + normalizeLimit(limit));
+        List<SalesLedger> rows = defaultList(salesLedgerMapper.selectList(wrapper));
+        if (rows.isEmpty()) {
+            return jsonResponse(true, "sales_ledger_list", "鏈煡璇㈠埌绗﹀悎鏉′欢鐨勯攢鍞彴璐�", rangeSummary(range, 0, keyword), Map.of("items", List.of()), Map.of());
+        }
+
+        List<Long> ledgerIds = rows.stream().map(SalesLedger::getId).filter(Objects::nonNull).collect(Collectors.toList());
+        Map<Long, BigDecimal> invoiceAmountByLedgerId = sumInvoiceAmounts(ledgerIds);
+        Map<Long, BigDecimal> receiptAmountByLedgerId = sumReceiptAmounts(loginUser, ledgerIds);
+        Map<Long, List<ShippingInfo>> shippingByLedgerId = queryShippingsByLedgerIds(loginUser, ledgerIds).stream()
+                .collect(Collectors.groupingBy(ShippingInfo::getSalesLedgerId));
+
+        BigDecimal contractAmountTotal = BigDecimal.ZERO;
+        BigDecimal invoicedAmountTotal = BigDecimal.ZERO;
+        BigDecimal receivedAmountTotal = BigDecimal.ZERO;
+        BigDecimal pendingAmountTotal = BigDecimal.ZERO;
+
+        List<Map<String, Object>> items = new ArrayList<>();
+        for (SalesLedger ledger : rows) {
+            BigDecimal contractAmount = defaultDecimal(ledger.getContractAmount());
+            BigDecimal invoicedAmount = invoiceAmountByLedgerId.getOrDefault(ledger.getId(), BigDecimal.ZERO);
+            BigDecimal receivedAmount = receiptAmountByLedgerId.getOrDefault(ledger.getId(), BigDecimal.ZERO);
+            BigDecimal unbilledAmount = maxZero(contractAmount.subtract(invoicedAmount));
+            BigDecimal pendingAmount = maxZero(invoicedAmount.subtract(receivedAmount));
+
+            contractAmountTotal = contractAmountTotal.add(contractAmount);
+            invoicedAmountTotal = invoicedAmountTotal.add(invoicedAmount);
+            receivedAmountTotal = receivedAmountTotal.add(receivedAmount);
+            pendingAmountTotal = pendingAmountTotal.add(pendingAmount);
+
+            Map<String, Object> item = new LinkedHashMap<>();
+            item.put("id", ledger.getId());
+            item.put("salesContractNo", safe(ledger.getSalesContractNo()));
+            item.put("customerContractNo", safe(ledger.getCustomerContractNo()));
+            item.put("customerName", safe(ledger.getCustomerName()));
+            item.put("projectName", safe(ledger.getProjectName()));
+            item.put("salesman", safe(ledger.getSalesman()));
+            item.put("entryDate", formatDate(ledger.getEntryDate()));
+            item.put("executionDate", formatDate(ledger.getExecutionDate()));
+            item.put("deliveryDate", formatDate(ledger.getDeliveryDate()));
+            item.put("contractAmount", contractAmount);
+            item.put("invoicedAmount", invoicedAmount);
+            item.put("receivedAmount", receivedAmount);
+            item.put("unbilledAmount", unbilledAmount);
+            item.put("pendingAmount", pendingAmount);
+            item.put("shippingStatus", calcLedgerShippingStatus(shippingByLedgerId.get(ledger.getId())));
+            items.add(item);
+        }
+
+        Map<String, Object> summary = rangeSummary(range, items.size(), keyword);
+        summary.put("contractAmountTotal", contractAmountTotal);
+        summary.put("invoicedAmountTotal", invoicedAmountTotal);
+        summary.put("receivedAmountTotal", receivedAmountTotal);
+        summary.put("pendingAmountTotal", pendingAmountTotal);
+        return jsonResponse(true, "sales_ledger_list", "宸茶繑鍥為攢鍞彴璐﹀垪琛�", summary, Map.of("items", items), Map.of());
+    }
+
+    @Tool(name = "鏌ヨ閿�鍞��璐�", value = "鎸夋椂闂磋寖鍥村拰鍏抽敭璇嶆煡璇㈤攢鍞��璐ц褰�")
+    public String listSalesReturns(@ToolMemoryId String memoryId,
+                                   @P(value = "寮�濮嬫棩鏈� yyyy-MM-dd", required = false) String startDate,
+                                   @P(value = "缁撴潫鏃ユ湡 yyyy-MM-dd", required = false) String endDate,
+                                   @P(value = "鍏抽敭璇嶏紝鍙尮閰嶉��娆惧崟鍙�/浜ゆ槗鍙�/浠樻璐︽埛", required = false) String keyword,
+                                   @P(value = "杩斿洖鏉℃暟锛岄粯璁�10锛屾渶澶�30", required = false) Integer limit) {
+        LoginUser loginUser = currentLoginUser(memoryId);
+        DateRange range = resolveDateRange(startDate, endDate, null);
+        LambdaQueryWrapper<SalesReceiptReturn> wrapper = new LambdaQueryWrapper<>();
+        applyDeptFilter(wrapper, loginUser.getCurrentDeptId(), SalesReceiptReturn::getDeptId);
+        if (StringUtils.hasText(keyword)) {
+            wrapper.and(w -> w.like(SalesReceiptReturn::getRefundId, keyword)
+                    .or().like(SalesReceiptReturn::getTransactionNo, keyword)
+                    .or().like(SalesReceiptReturn::getPaymentAccountName, keyword));
+        }
+        wrapper.ge(SalesReceiptReturn::getCreateTime, range.start().atStartOfDay())
+                .le(SalesReceiptReturn::getCreateTime, range.end().atTime(23, 59, 59))
+                .orderByDesc(SalesReceiptReturn::getCreateTime, SalesReceiptReturn::getId)
+                .last("limit " + normalizeLimit(limit));
+        List<SalesReceiptReturn> rows = defaultList(salesReceiptReturnMapper.selectList(wrapper));
+
+        BigDecimal returnAmount = rows.stream()
+                .map(SalesReceiptReturn::getActualAmount)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        List<Map<String, Object>> items = rows.stream().map(item -> {
+            Map<String, Object> map = new LinkedHashMap<>();
+            map.put("id", item.getId());
+            map.put("refundId", safe(item.getRefundId()));
+            map.put("paymentAccount", safe(item.getPaymentAccount()));
+            map.put("paymentAccountName", safe(item.getPaymentAccountName()));
+            map.put("paymentMethod", item.getPaymentMethod());
+            map.put("actualAmount", item.getActualAmount());
+            map.put("fee", item.getFee());
+            map.put("discountAmount", item.getDiscountAmount());
+            map.put("transactionNo", safe(item.getTransactionNo()));
+            map.put("createTime", formatDateTime(item.getCreateTime()));
+            return map;
+        }).collect(Collectors.toList());
+
+        Map<String, Object> summary = rangeSummary(range, items.size(), keyword);
+        summary.put("returnAmount", returnAmount);
+        return jsonResponse(true, "sales_return_list", "宸茶繑鍥為攢鍞��璐ц褰�", summary, Map.of("items", items), Map.of());
+    }
+
+    @Tool(name = "鏌ヨ瀹㈡埛寰�鏉�", value = "鎸夋椂闂磋寖鍥村拰鍏抽敭璇嶆煡璇㈠鎴峰洖娆惧線鏉ユ槑缁�")
+    public String listCustomerInteractions(@ToolMemoryId String memoryId,
+                                           @P(value = "鍏抽敭璇嶏紝鍙尮閰嶅鎴峰悕绉�/閿�鍞悎鍚屽彿/椤圭洰鍚�", required = false) String keyword,
+                                           @P(value = "寮�濮嬫棩鏈� yyyy-MM-dd", required = false) String startDate,
+                                           @P(value = "缁撴潫鏃ユ湡 yyyy-MM-dd", required = false) String endDate,
+                                           @P(value = "杩斿洖鏉℃暟锛岄粯璁�10锛屾渶澶�30", required = false) Integer limit) {
+        LoginUser loginUser = currentLoginUser(memoryId);
+        DateRange range = resolveDateRange(startDate, endDate, null);
+        LambdaQueryWrapper<ReceiptPayment> wrapper = new LambdaQueryWrapper<>();
+        applyTenantFilter(wrapper, loginUser.getTenantId(), ReceiptPayment::getTenantId);
+        applyDeptFilter(wrapper, loginUser.getCurrentDeptId(), ReceiptPayment::getDeptId);
+        wrapper.ge(ReceiptPayment::getReceiptPaymentDate, range.start())
+                .le(ReceiptPayment::getReceiptPaymentDate, range.end())
+                .orderByDesc(ReceiptPayment::getReceiptPaymentDate, ReceiptPayment::getId);
+        List<ReceiptPayment> payments = defaultList(receiptPaymentMapper.selectList(wrapper));
+        if (payments.isEmpty()) {
+            return jsonResponse(true, "sales_customer_interaction_list", "鏈煡璇㈠埌瀹㈡埛寰�鏉ヨ褰�", rangeSummary(range, 0, keyword), Map.of("items", List.of()), Map.of());
+        }
+
+        List<Long> ledgerIds = payments.stream()
+                .map(ReceiptPayment::getSalesLedgerId)
+                .filter(Objects::nonNull)
+                .distinct()
+                .collect(Collectors.toList());
+        Map<Long, SalesLedger> ledgerMap = defaultList(salesLedgerMapper.selectBatchIds(ledgerIds)).stream()
+                .filter(ledger -> tenantMatched(ledger.getTenantId(), loginUser.getTenantId()))
+                .collect(Collectors.toMap(SalesLedger::getId, item -> item, (a, b) -> a, LinkedHashMap::new));
+
+        List<ReceiptPayment> filtered = payments.stream()
+                .filter(item -> matchInteractionKeyword(item, ledgerMap.get(item.getSalesLedgerId()), keyword))
+                .limit(normalizeLimit(limit))
+                .collect(Collectors.toList());
+
+        BigDecimal totalReceiptAmount = filtered.stream()
+                .map(ReceiptPayment::getReceiptPaymentAmount)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        List<Map<String, Object>> items = filtered.stream().map(item -> {
+            SalesLedger ledger = ledgerMap.get(item.getSalesLedgerId());
+            Map<String, Object> map = new LinkedHashMap<>();
+            map.put("id", item.getId());
+            map.put("salesLedgerId", item.getSalesLedgerId());
+            map.put("salesContractNo", ledger == null ? "" : safe(ledger.getSalesContractNo()));
+            map.put("customerName", ledger == null ? "" : safe(ledger.getCustomerName()));
+            map.put("projectName", ledger == null ? "" : safe(ledger.getProjectName()));
+            map.put("receiptPaymentDate", formatDate(item.getReceiptPaymentDate()));
+            map.put("receiptPaymentAmount", item.getReceiptPaymentAmount());
+            map.put("receiptPaymentType", safe(item.getReceiptPaymentType()));
+            map.put("registrant", safe(item.getRegistrant()));
+            return map;
+        }).collect(Collectors.toList());
+
+        Map<String, Object> summary = rangeSummary(range, items.size(), keyword);
+        summary.put("totalReceiptAmount", totalReceiptAmount);
+        summary.put("customerCount", items.stream().map(item -> String.valueOf(item.get("customerName"))).filter(StringUtils::hasText).distinct().count());
+        return jsonResponse(true, "sales_customer_interaction_list", "宸茶繑鍥炲鎴峰線鏉ユ槑缁�", summary, Map.of("items", items), Map.of());
+    }
+
+    @Tool(name = "鏌ヨ鍙戣揣鍙拌处", value = "鎸夊叧閿瘝鍜屾椂闂磋寖鍥存煡璇㈠彂璐у彴璐�")
+    public String listShippingLedgers(@ToolMemoryId String memoryId,
+                                      @P(value = "鍏抽敭璇嶏紝鍙尮閰嶅彂璐у崟鍙�/蹇�掑崟鍙�/鐗╂祦鍏徃/杞︾墝鍙�", required = false) String keyword,
+                                      @P(value = "寮�濮嬫棩鏈� yyyy-MM-dd", required = false) String startDate,
+                                      @P(value = "缁撴潫鏃ユ湡 yyyy-MM-dd", required = false) String endDate,
+                                      @P(value = "杩斿洖鏉℃暟锛岄粯璁�10锛屾渶澶�30", required = false) Integer limit) {
+        LoginUser loginUser = currentLoginUser(memoryId);
+        DateRange range = resolveDateRange(startDate, endDate, null);
+        LambdaQueryWrapper<ShippingInfo> wrapper = new LambdaQueryWrapper<>();
+        applyTenantFilter(wrapper, loginUser.getTenantId(), ShippingInfo::getTenantId);
+        applyDeptFilter(wrapper, loginUser.getCurrentDeptId(), ShippingInfo::getDeptId);
+        if (StringUtils.hasText(keyword)) {
+            wrapper.and(w -> w.like(ShippingInfo::getShippingNo, keyword)
+                    .or().like(ShippingInfo::getExpressNumber, keyword)
+                    .or().like(ShippingInfo::getExpressCompany, keyword)
+                    .or().like(ShippingInfo::getShippingCarNumber, keyword)
+                    .or().like(ShippingInfo::getStatus, keyword));
+        }
+        wrapper.ge(ShippingInfo::getShippingDate, toDate(range.start()))
+                .lt(ShippingInfo::getShippingDate, toExclusiveEndDate(range.end()))
+                .orderByDesc(ShippingInfo::getShippingDate, ShippingInfo::getId)
+                .last("limit " + normalizeLimit(limit));
+        List<ShippingInfo> rows = defaultList(shippingInfoMapper.selectList(wrapper));
+        if (rows.isEmpty()) {
+            return jsonResponse(true, "sales_shipping_list", "鏈煡璇㈠埌鍙戣揣鍙拌处璁板綍", rangeSummary(range, 0, keyword), Map.of("items", List.of()), Map.of());
+        }
+
+        List<Long> ledgerIds = rows.stream().map(ShippingInfo::getSalesLedgerId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+        Map<Long, SalesLedger> ledgerMap = defaultList(salesLedgerMapper.selectBatchIds(ledgerIds)).stream()
+                .filter(ledger -> tenantMatched(ledger.getTenantId(), loginUser.getTenantId()))
+                .collect(Collectors.toMap(SalesLedger::getId, item -> item, (a, b) -> a, LinkedHashMap::new));
+
+        long shippedCount = rows.stream().filter(item -> isShippedStatus(item.getStatus())).count();
+        List<Map<String, Object>> items = rows.stream().map(item -> {
+            SalesLedger ledger = ledgerMap.get(item.getSalesLedgerId());
+            Map<String, Object> map = new LinkedHashMap<>();
+            map.put("id", item.getId());
+            map.put("salesLedgerId", item.getSalesLedgerId());
+            map.put("salesContractNo", ledger == null ? "" : safe(ledger.getSalesContractNo()));
+            map.put("customerName", ledger == null ? "" : safe(ledger.getCustomerName()));
+            map.put("shippingNo", safe(item.getShippingNo()));
+            map.put("status", safe(item.getStatus()));
+            map.put("shippingDate", formatDate(item.getShippingDate()));
+            map.put("type", safe(item.getType()));
+            map.put("shippingCarNumber", safe(item.getShippingCarNumber()));
+            map.put("expressCompany", safe(item.getExpressCompany()));
+            map.put("expressNumber", safe(item.getExpressNumber()));
+            return map;
+        }).collect(Collectors.toList());
+
+        Map<String, Object> summary = rangeSummary(range, items.size(), keyword);
+        summary.put("shippingCount", rows.size());
+        summary.put("shippedCount", shippedCount);
+        summary.put("pendingCount", Math.max(rows.size() - shippedCount, 0));
+        return jsonResponse(true, "sales_shipping_list", "宸茶繑鍥炲彂璐у彴璐﹁褰�", summary, Map.of("items", items), Map.of());
+    }
+
+    @Tool(name = "鏌ヨ閿�鍞寚鏍囩粺璁�", value = "鎸夋椂闂磋寖鍥寸粺璁¢攢鍞悎鍚屻�佹姤浠枫�佸彂璐с�佸洖娆剧瓑鍏抽敭鎸囨爣")
+    public String getSalesDashboard(@ToolMemoryId String memoryId,
+                                    @P(value = "寮�濮嬫棩鏈� yyyy-MM-dd", required = false) String startDate,
+                                    @P(value = "缁撴潫鏃ユ湡 yyyy-MM-dd", required = false) String endDate,
+                                    @P(value = "鏃堕棿鑼冨洿鎻忚堪锛屽鏈湀銆佹湰骞淬�佽繎30澶�", required = false) String timeRange) {
+        LoginUser loginUser = currentLoginUser(memoryId);
+        DateRange range = resolveDateRange(startDate, endDate, timeRange);
+
+        List<SalesLedger> ledgers = querySalesLedgers(loginUser, range);
+        List<SalesQuotation> quotations = querySalesQuotations(loginUser, range);
+        List<ShippingInfo> shippings = queryShippings(loginUser, range);
+        List<ReceiptPayment> receipts = queryReceipts(loginUser, range);
+
+        BigDecimal contractAmountTotal = ledgers.stream()
+                .map(SalesLedger::getContractAmount)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        BigDecimal quotationAmountTotal = quotations.stream()
+                .map(SalesQuotation::getTotalAmount)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        BigDecimal receivedAmountTotal = receipts.stream()
+                .map(ReceiptPayment::getReceiptPaymentAmount)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        BigDecimal pendingAmountTotal = maxZero(contractAmountTotal.subtract(receivedAmountTotal));
+
+        long shippingCount = shippings.size();
+        long shippedCount = shippings.stream().filter(item -> isShippedStatus(item.getStatus())).count();
+        String shipRate = toRate(shippedCount, shippingCount);
+
+        List<Map<String, Object>> topCustomers = buildTopCustomers(ledgers);
+        TrendData trendData = buildContractTrendData(ledgers, range);
+
+        Map<String, Object> summary = new LinkedHashMap<>();
+        summary.put("timeRange", range.label());
+        summary.put("startDate", range.start().toString());
+        summary.put("endDate", range.end().toString());
+        summary.put("orderCount", ledgers.size());
+        summary.put("quotationCount", quotations.size());
+        summary.put("shippingCount", shippingCount);
+        summary.put("shippedCount", shippedCount);
+        summary.put("shipRate", shipRate);
+        summary.put("contractAmountTotal", contractAmountTotal);
+        summary.put("quotationAmountTotal", quotationAmountTotal);
+        summary.put("receivedAmountTotal", receivedAmountTotal);
+        summary.put("pendingAmountTotal", pendingAmountTotal);
+
+        Map<String, Object> charts = new LinkedHashMap<>();
+        charts.put("amountBarOption", buildAmountBarOption(contractAmountTotal, quotationAmountTotal, receivedAmountTotal, pendingAmountTotal));
+        charts.put("shippingPieOption", buildShippingPieOption(shippedCount, Math.max(shippingCount - shippedCount, 0)));
+        charts.put("customerTopBarOption", buildCustomerTopBarOption(topCustomers));
+        charts.put("contractTrendLineOption", buildContractTrendLineOption(trendData.labels(), trendData.values()));
+
+        Map<String, Object> data = new LinkedHashMap<>();
+        data.put("topCustomers", topCustomers);
+        data.put("contractTrend", trendData.toItemList());
+
+        return jsonResponse(true, "sales_dashboard", "宸茶繑鍥為攢鍞寚鏍囩粺璁�", summary, data, charts);
+    }
+
+    @Tool(name = "瀹㈡埛娴佸け椋庨櫓鍒嗘瀽", value = "鎸夊鎴风淮搴﹁瘎浼版祦澶遍闄╋紝杈撳嚭椋庨櫓鍒嗙骇銆佸師鍥犲拰寤鸿浼樺厛绾�")
+    public String analyzeCustomerChurnRisk(@ToolMemoryId String memoryId,
+                                           @P(value = "寮�濮嬫棩鏈� yyyy-MM-dd", required = false) String startDate,
+                                           @P(value = "缁撴潫鏃ユ湡 yyyy-MM-dd", required = false) String endDate,
+                                           @P(value = "鏃堕棿鑼冨洿鎻忚堪锛屽杩�90澶┿�佹湰骞�", required = false) String timeRange,
+                                           @P(value = "鍏抽敭璇嶏紝鍙尮閰嶅鎴峰悕绉�", required = false) String keyword,
+                                           @P(value = "杩斿洖鏉℃暟锛岄粯璁�10锛屾渶澶�30", required = false) Integer limit) {
+        LoginUser loginUser = currentLoginUser(memoryId);
+        DateRange range = resolveDateRange(startDate, endDate, StringUtils.hasText(timeRange) ? timeRange : "杩�180澶�");
+        List<CustomerRiskMetric> metrics = buildCustomerRiskMetrics(loginUser, range, keyword);
+        if (metrics.isEmpty()) {
+            return jsonResponse(true, "sales_customer_churn_risk", "褰撳墠鑼冨洿鍐呮湭鏌ヨ鍒板彲鍒嗘瀽鐨勫鎴锋暟鎹�",
+                    rangeSummary(range, 0, keyword), Map.of("items", List.of()), Map.of());
+        }
+
+        List<CustomerRiskMetric> sorted = metrics.stream()
+                .sorted(Comparator.comparing(CustomerRiskMetric::getRiskScore).reversed()
+                        .thenComparing(CustomerRiskMetric::getPendingAmount, Comparator.reverseOrder()))
+                .limit(normalizeLimit(limit))
+                .collect(Collectors.toList());
+
+        long highCount = sorted.stream().filter(item -> "high".equals(item.getRiskLevel())).count();
+        long mediumCount = sorted.stream().filter(item -> "medium".equals(item.getRiskLevel())).count();
+        long lowCount = sorted.stream().filter(item -> "low".equals(item.getRiskLevel())).count();
+
+        List<Map<String, Object>> items = sorted.stream().map(this::toRiskItem).collect(Collectors.toList());
+        Map<String, Object> summary = rangeSummary(range, items.size(), keyword);
+        summary.put("highRiskCount", highCount);
+        summary.put("mediumRiskCount", mediumCount);
+        summary.put("lowRiskCount", lowCount);
+
+        Map<String, Object> charts = new LinkedHashMap<>();
+        charts.put("riskLevelPieOption", buildRiskLevelPieOption(highCount, mediumCount, lowCount));
+        charts.put("riskScoreBarOption", buildRiskScoreBarOption(sorted));
+
+        return jsonResponse(true, "sales_customer_churn_risk", "宸插畬鎴愬鎴锋祦澶遍闄╁垎鏋�", summary, Map.of("items", items), charts);
+    }
+
+    @Tool(name = "鍥炴涓庢姤浠风瓥鐣ュ缓璁�", value = "鍩轰簬瀹㈡埛椋庨櫓銆佸洖娆惧拰鎶ヤ环鎯呭喌鐢熸垚鍙墽琛岀殑璺熻繘绛栫暐")
+    public String suggestCollectionAndQuotationStrategy(@ToolMemoryId String memoryId,
+                                                        @P(value = "寮�濮嬫棩鏈� yyyy-MM-dd", required = false) String startDate,
+                                                        @P(value = "缁撴潫鏃ユ湡 yyyy-MM-dd", required = false) String endDate,
+                                                        @P(value = "鏃堕棿鑼冨洿鎻忚堪锛屽杩�90澶┿�佹湰鏈�", required = false) String timeRange,
+                                                        @P(value = "鍏抽敭璇嶏紝鍙尮閰嶅鎴峰悕绉�", required = false) String keyword,
+                                                        @P(value = "杩斿洖鏉℃暟锛岄粯璁�10锛屾渶澶�30", required = false) Integer limit,
+                                                        @P(value = "鏄惁浼樺厛楂橀闄╁鎴凤紝true 琛ㄧず楂橀闄╀紭鍏�", required = false) Boolean prioritizeHighRisk) {
+        LoginUser loginUser = currentLoginUser(memoryId);
+        DateRange range = resolveDateRange(startDate, endDate, StringUtils.hasText(timeRange) ? timeRange : "杩�90澶�");
+        List<CustomerRiskMetric> metrics = buildCustomerRiskMetrics(loginUser, range, keyword);
+        if (metrics.isEmpty()) {
+            return jsonResponse(true, "sales_collection_quote_strategy", "褰撳墠鑼冨洿鍐呮湭鏌ヨ鍒板彲鐢熸垚绛栫暐鐨勫鎴锋暟鎹�",
+                    rangeSummary(range, 0, keyword), Map.of("items", List.of()), Map.of());
+        }
+
+        boolean highRiskFirst = Boolean.TRUE.equals(prioritizeHighRisk);
+        Comparator<CustomerRiskMetric> sortComparator;
+        if (highRiskFirst) {
+            sortComparator = Comparator
+                    .comparingInt((CustomerRiskMetric metric) -> riskLevelRank(metric.getRiskLevel())).reversed()
+                    .thenComparing(CustomerRiskMetric::getRiskScore, Comparator.reverseOrder())
+                    .thenComparing(CustomerRiskMetric::getPendingAmount, Comparator.reverseOrder());
+        } else {
+            sortComparator = Comparator
+                    .comparing(CustomerRiskMetric::getPendingAmount, Comparator.reverseOrder())
+                    .thenComparing(CustomerRiskMetric::getRiskScore, Comparator.reverseOrder());
+        }
+
+        List<CustomerRiskMetric> sorted = metrics.stream()
+                .sorted(sortComparator)
+                .limit(normalizeLimit(limit))
+                .collect(Collectors.toList());
+
+        List<Map<String, Object>> items = sorted.stream().map(this::toStrategyItem).collect(Collectors.toList());
+        long highPriorityCount = items.stream().filter(item -> "high".equals(item.get("priority"))).count();
+        long mediumPriorityCount = items.stream().filter(item -> "medium".equals(item.get("priority"))).count();
+        long lowPriorityCount = items.stream().filter(item -> "low".equals(item.get("priority"))).count();
+
+        Map<String, Object> summary = rangeSummary(range, items.size(), keyword);
+        summary.put("highPriorityCount", highPriorityCount);
+        summary.put("mediumPriorityCount", mediumPriorityCount);
+        summary.put("lowPriorityCount", lowPriorityCount);
+        summary.put("prioritizeHighRisk", highRiskFirst);
+        summary.put("priorityMode", highRiskFirst ? "high_risk_first" : "pending_amount_first");
+
+        Map<String, Object> charts = new LinkedHashMap<>();
+        charts.put("pendingAmountBarOption", buildPendingAmountBarOption(sorted));
+        charts.put("priorityPieOption", buildPriorityPieOption(highPriorityCount, mediumPriorityCount, lowPriorityCount));
+
+        return jsonResponse(true, "sales_collection_quote_strategy", "宸茬敓鎴愬洖娆句笌鎶ヤ环绛栫暐寤鸿", summary, Map.of("items", items), charts);
+    }
+
+    private List<CustomerRiskMetric> buildCustomerRiskMetrics(LoginUser loginUser, DateRange range, String keyword) {
+        List<SalesLedger> ledgers = querySalesLedgers(loginUser, range).stream()
+                .filter(item -> matchLedgerCustomerKeyword(item, keyword))
+                .collect(Collectors.toList());
+        if (ledgers.isEmpty()) {
+            return List.of();
+        }
+
+        Map<String, CustomerRiskMetric> metricMap = new LinkedHashMap<>();
+        for (SalesLedger ledger : ledgers) {
+            String customerName = StringUtils.hasText(ledger.getCustomerName()) ? ledger.getCustomerName().trim() : "鏈煡瀹㈡埛";
+            CustomerRiskMetric metric = metricMap.computeIfAbsent(customerName, CustomerRiskMetric::new);
+            metric.setOrderCount(metric.getOrderCount() + 1);
+            metric.setContractAmount(metric.getContractAmount().add(defaultDecimal(ledger.getContractAmount())));
+            metric.setTopSingleOrderAmount(metric.getTopSingleOrderAmount().max(defaultDecimal(ledger.getContractAmount())));
+            LocalDate entryDate = toLocalDate(ledger.getEntryDate());
+            if (entryDate != null && (metric.getLastOrderDate() == null || entryDate.isAfter(metric.getLastOrderDate()))) {
+                metric.setLastOrderDate(entryDate);
+            }
+            if (ledger.getId() != null) {
+                metric.getLedgerIds().add(ledger.getId());
+                if (ledger.getDeliveryDate() != null) {
+                    metric.getDeliveryDateByLedgerId().put(ledger.getId(), ledger.getDeliveryDate());
+                }
+            }
+        }
+
+        List<Long> allLedgerIds = metricMap.values().stream()
+                .flatMap(metric -> metric.getLedgerIds().stream())
+                .distinct()
+                .collect(Collectors.toList());
+        Map<Long, BigDecimal> receiptAmountByLedgerId = sumReceiptAmounts(loginUser, allLedgerIds);
+        Map<Long, List<ShippingInfo>> shippingByLedgerId = queryShippingsByLedgerIds(loginUser, allLedgerIds).stream()
+                .collect(Collectors.groupingBy(ShippingInfo::getSalesLedgerId));
+
+        List<SalesQuotation> quotations = querySalesQuotations(loginUser, range);
+        for (SalesQuotation quotation : quotations) {
+            String customerName = safe(quotation.getCustomer());
+            CustomerRiskMetric metric = metricMap.get(customerName);
+            if (metric == null) {
+                continue;
+            }
+            metric.setQuoteCount(metric.getQuoteCount() + 1);
+            metric.setQuoteAmount(metric.getQuoteAmount().add(defaultDecimal(quotation.getTotalAmount())));
+        }
+
+        LocalDate today = LocalDate.now();
+        for (CustomerRiskMetric metric : metricMap.values()) {
+            BigDecimal receivedAmount = BigDecimal.ZERO;
+            long overdueDeliveryCount = 0;
+            for (Long ledgerId : metric.getLedgerIds()) {
+                receivedAmount = receivedAmount.add(receiptAmountByLedgerId.getOrDefault(ledgerId, BigDecimal.ZERO));
+                LocalDate deliveryDate = metric.getDeliveryDateByLedgerId().get(ledgerId);
+                if (deliveryDate != null && deliveryDate.isBefore(today) && !isLedgerFullyShipped(ledgerId, shippingByLedgerId)) {
+                    overdueDeliveryCount++;
+                }
+            }
+            metric.setReceivedAmount(receivedAmount);
+            metric.setPendingAmount(maxZero(metric.getContractAmount().subtract(receivedAmount)));
+            if (metric.getContractAmount().compareTo(BigDecimal.ZERO) > 0) {
+                metric.setPendingRate(metric.getPendingAmount()
+                        .divide(metric.getContractAmount(), 4, RoundingMode.HALF_UP));
+            } else {
+                metric.setPendingRate(BigDecimal.ZERO);
+            }
+            metric.setOverdueDeliveryCount(overdueDeliveryCount);
+            if (metric.getLastOrderDate() == null) {
+                metric.setDaysSinceLastOrder(999);
+            } else {
+                metric.setDaysSinceLastOrder(Math.max(today.toEpochDay() - metric.getLastOrderDate().toEpochDay(), 0));
+            }
+            evaluateRiskMetric(metric);
+        }
+        return new ArrayList<>(metricMap.values());
+    }
+
+    private void evaluateRiskMetric(CustomerRiskMetric metric) {
+        int score = 0;
+        List<String> reasons = new ArrayList<>();
+        if (metric.getDaysSinceLastOrder() >= 90) {
+            score += 35;
+            reasons.add("杩�90澶╂棤鏂板璁㈠崟");
+        } else if (metric.getDaysSinceLastOrder() >= 60) {
+            score += 25;
+            reasons.add("杩�60澶╄鍗曟椿璺冨害涓嬮檷");
+        } else if (metric.getDaysSinceLastOrder() >= 30) {
+            score += 12;
+            reasons.add("杩�30澶╄鍗曟尝鍔ㄥ亸寮�");
+        }
+
+        if (metric.getPendingRate().compareTo(new BigDecimal("0.60")) >= 0) {
+            score += 30;
+            reasons.add("寰呭洖娆惧崰姣旈珮浜�60%");
+        } else if (metric.getPendingRate().compareTo(new BigDecimal("0.30")) >= 0) {
+            score += 20;
+            reasons.add("寰呭洖娆惧崰姣旈珮浜�30%");
+        } else if (metric.getPendingRate().compareTo(new BigDecimal("0.10")) >= 0) {
+            score += 10;
+            reasons.add("瀛樺湪寰呭洖娆鹃闄�");
+        }
+
+        if (metric.getOverdueDeliveryCount() > 0) {
+            score += Math.min((int) metric.getOverdueDeliveryCount() * 6, 20);
+            reasons.add("瀛樺湪浜ゆ湡閫炬湡璁㈠崟");
+        }
+
+        if (metric.getOrderCount() <= 1) {
+            score += 8;
+            reasons.add("璁㈠崟鍩烘暟鍋忎綆");
+        }
+
+        if (metric.getQuoteCount() > 0 && metric.getOrderCount() == 0) {
+            score += 10;
+            reasons.add("鎶ヤ环鏈舰鎴愯鍗曡浆鍖�");
+        }
+
+        score = Math.min(score, 100);
+        metric.setRiskScore(score);
+        if (score >= 70) {
+            metric.setRiskLevel("high");
+        } else if (score >= 40) {
+            metric.setRiskLevel("medium");
+        } else {
+            metric.setRiskLevel("low");
+        }
+        metric.setRiskReasons(reasons);
+    }
+
+    private Map<String, Object> toRiskItem(CustomerRiskMetric metric) {
+        Map<String, Object> map = new LinkedHashMap<>();
+        map.put("customerName", metric.getCustomerName());
+        map.put("riskLevel", metric.getRiskLevel());
+        map.put("riskScore", metric.getRiskScore());
+        map.put("contractAmount", metric.getContractAmount());
+        map.put("receivedAmount", metric.getReceivedAmount());
+        map.put("pendingAmount", metric.getPendingAmount());
+        map.put("pendingRate", toPercent(metric.getPendingRate()));
+        map.put("orderCount", metric.getOrderCount());
+        map.put("quoteCount", metric.getQuoteCount());
+        map.put("overdueDeliveryCount", metric.getOverdueDeliveryCount());
+        map.put("daysSinceLastOrder", metric.getDaysSinceLastOrder());
+        map.put("lastOrderDate", formatDate(metric.getLastOrderDate()));
+        map.put("riskReasons", metric.getRiskReasons());
+        return map;
+    }
+
+    private Map<String, Object> toStrategyItem(CustomerRiskMetric metric) {
+        String priority = strategyPriority(metric);
+        Map<String, Object> map = new LinkedHashMap<>();
+        map.put("customerName", metric.getCustomerName());
+        map.put("riskLevel", metric.getRiskLevel());
+        map.put("riskScore", metric.getRiskScore());
+        map.put("priority", priority);
+        map.put("pendingAmount", metric.getPendingAmount());
+        map.put("pendingRate", toPercent(metric.getPendingRate()));
+        map.put("quoteCount", metric.getQuoteCount());
+        map.put("orderCount", metric.getOrderCount());
+        map.put("quoteConversionRate", toRate(metric.getOrderCount(), Math.max(metric.getQuoteCount(), 1)));
+        map.put("collectionStrategy", buildCollectionStrategy(metric));
+        map.put("quotationStrategy", buildQuotationStrategy(metric));
+        map.put("nextAction", buildNextAction(priority));
+        map.put("topSingleOrderAmount", metric.getTopSingleOrderAmount());
+        return map;
+    }
+
+    private String buildCollectionStrategy(CustomerRiskMetric metric) {
+        if (metric.getPendingAmount().compareTo(BigDecimal.ZERO) <= 0) {
+            return "淇濇寔姝e父鏈堝害瀵硅处涓庡洖娆剧‘璁わ紝缁存寔瀹㈡埛鍥炴鑺傚銆�";
+        }
+        if (metric.getPendingRate().compareTo(new BigDecimal("0.60")) >= 0) {
+            return "浼樺厛閿佸畾鍥炴璁″垝锛屾寜鍛ㄦ媶鍒嗗洖娆捐妭鐐瑰苟缁戝畾鍙戣揣鏉′欢锛岄伩鍏嶆柊澧炰俊鐢ㄦ暈鍙c��";
+        }
+        if (metric.getPendingRate().compareTo(new BigDecimal("0.30")) >= 0) {
+            return "寤鸿鎵ц鍙屽懆鍌敹鏈哄埗锛屽悓姝ヨ储鍔′笌涓氬姟鑱斿悎璺熻繘閲嶇偣鍚堝悓銆�";
+        }
+        return "淇濇寔姝e父鍌敹鑺傚锛屾寜鍚堝悓鑺傜偣鎻愬墠3澶╂彁閱掑鎴蜂粯娆俱��";
+    }
+
+    private String buildQuotationStrategy(CustomerRiskMetric metric) {
+        if ("high".equals(metric.getRiskLevel())) {
+            return "鎶ヤ环浼樺厛淇濇瘺鍒╀笌鍥炴鏉℃锛屽噺灏戣秴闀胯处鏈燂紝蹇呰鏃堕噰鐢ㄥ垎闃舵鎶ヤ环銆�";
+        }
+        if (metric.getQuoteCount() > 0 && metric.getOrderCount() < metric.getQuoteCount()) {
+            return "浼樺寲鎶ヤ环缁撴瀯锛屽缓璁彁渚涘熀纭�鐗�+鍗囩骇鐗堢粍鍚堟姤浠凤紝鎻愰珮杞寲鐜囥��";
+        }
+        if (metric.getOrderCount() <= 1) {
+            return "鍔犲己闇�姹傛寲鎺橈紝鍥寸粫瀹㈡埛鍦烘櫙琛ュ厖澧炲�奸」涓庝氦浠樹繚闅滄潯娆俱��";
+        }
+        return "淇濇寔褰撳墠鎶ヤ环绛栫暐锛岄噸鐐瑰洿缁曚氦鏈熷拰鏈嶅姟鑳藉姏鍋氬樊寮傚寲鍛堢幇銆�";
+    }
+
+    private String buildNextAction(String priority) {
+        return switch (priority) {
+            case "high" -> "48灏忔椂鍐呭畬鎴愬鎴峰洖璁匡紝纭鍥炴璁″垝骞跺鏍告姤浠锋湁鏁堟湡銆�";
+            case "medium" -> "鏈懆鍐呭畬鎴愬鎴烽渶姹傚鐩橈紝鏇存柊鎶ヤ环鐗堟湰骞跺悓姝ュ洖娆捐妭鐐广��";
+            default -> "淇濇寔鏈堝害渚嬭璺熻繘锛屾寔缁拷韪鎴烽噰璐鍒掑彉鍖栥��";
+        };
+    }
+
+    private String strategyPriority(CustomerRiskMetric metric) {
+        if ("high".equals(metric.getRiskLevel()) || metric.getPendingRate().compareTo(new BigDecimal("0.50")) >= 0) {
+            return "high";
+        }
+        if ("medium".equals(metric.getRiskLevel()) || metric.getPendingRate().compareTo(new BigDecimal("0.30")) >= 0) {
+            return "medium";
+        }
+        return "low";
+    }
+
+    private int riskLevelRank(String riskLevel) {
+        if ("high".equals(riskLevel)) {
+            return 3;
+        }
+        if ("medium".equals(riskLevel)) {
+            return 2;
+        }
+        return 1;
+    }
+
+    private List<Map<String, Object>> buildTopCustomers(List<SalesLedger> ledgers) {
+        Map<String, BigDecimal> grouped = new LinkedHashMap<>();
+        for (SalesLedger ledger : ledgers) {
+            String customerName = StringUtils.hasText(ledger.getCustomerName()) ? ledger.getCustomerName().trim() : "鏈煡瀹㈡埛";
+            grouped.merge(customerName, defaultDecimal(ledger.getContractAmount()), BigDecimal::add);
+        }
+        return grouped.entrySet().stream()
+                .sorted(Map.Entry.<String, BigDecimal>comparingByValue().reversed())
+                .limit(5)
+                .map(entry -> {
+                    Map<String, Object> map = new LinkedHashMap<>();
+                    map.put("customerName", entry.getKey());
+                    map.put("contractAmount", entry.getValue());
+                    return map;
+                })
+                .collect(Collectors.toList());
+    }
+
+    private TrendData buildContractTrendData(List<SalesLedger> ledgers, DateRange range) {
+        Map<String, BigDecimal> amountByMonth = new LinkedHashMap<>();
+        YearMonth startMonth = YearMonth.from(range.start());
+        YearMonth endMonth = YearMonth.from(range.end());
+        for (YearMonth month = startMonth; !month.isAfter(endMonth); month = month.plusMonths(1)) {
+            amountByMonth.put(month.toString(), BigDecimal.ZERO);
+        }
+        for (SalesLedger ledger : ledgers) {
+            LocalDate entryDate = toLocalDate(ledger.getEntryDate());
+            if (entryDate == null) {
+                continue;
+            }
+            String monthKey = YearMonth.from(entryDate).toString();
+            if (!amountByMonth.containsKey(monthKey)) {
+                continue;
+            }
+            amountByMonth.put(monthKey, amountByMonth.get(monthKey).add(defaultDecimal(ledger.getContractAmount())));
+        }
+        return new TrendData(new ArrayList<>(amountByMonth.keySet()), new ArrayList<>(amountByMonth.values()));
+    }
+
+    private List<SalesLedger> querySalesLedgers(LoginUser loginUser, DateRange range) {
+        LambdaQueryWrapper<SalesLedger> wrapper = new LambdaQueryWrapper<>();
+        applyTenantFilter(wrapper, loginUser.getTenantId(), SalesLedger::getTenantId);
+        applyDeptFilter(wrapper, loginUser.getCurrentDeptId(), SalesLedger::getDeptId);
+        if (range != null) {
+            wrapper.ge(SalesLedger::getEntryDate, toDate(range.start()))
+                    .lt(SalesLedger::getEntryDate, toExclusiveEndDate(range.end()));
+        }
+        return defaultList(salesLedgerMapper.selectList(wrapper));
+    }
+
+    private List<SalesQuotation> querySalesQuotations(LoginUser loginUser, DateRange range) {
+        LambdaQueryWrapper<SalesQuotation> wrapper = new LambdaQueryWrapper<>();
+        applyTenantFilter(wrapper, loginUser.getTenantId(), SalesQuotation::getTenantId);
+        applyDeptFilter(wrapper, loginUser.getCurrentDeptId(), SalesQuotation::getDeptId);
+        if (range != null) {
+            wrapper.ge(SalesQuotation::getQuotationDate, range.start())
+                    .le(SalesQuotation::getQuotationDate, range.end());
+        }
+        return defaultList(salesQuotationMapper.selectList(wrapper));
+    }
+
+    private List<ShippingInfo> queryShippings(LoginUser loginUser, DateRange range) {
+        LambdaQueryWrapper<ShippingInfo> wrapper = new LambdaQueryWrapper<>();
+        applyTenantFilter(wrapper, loginUser.getTenantId(), ShippingInfo::getTenantId);
+        applyDeptFilter(wrapper, loginUser.getCurrentDeptId(), ShippingInfo::getDeptId);
+        if (range != null) {
+            wrapper.ge(ShippingInfo::getShippingDate, toDate(range.start()))
+                    .lt(ShippingInfo::getShippingDate, toExclusiveEndDate(range.end()));
+        }
+        return defaultList(shippingInfoMapper.selectList(wrapper));
+    }
+
+    private List<ReceiptPayment> queryReceipts(LoginUser loginUser, DateRange range) {
+        LambdaQueryWrapper<ReceiptPayment> wrapper = new LambdaQueryWrapper<>();
+        applyTenantFilter(wrapper, loginUser.getTenantId(), ReceiptPayment::getTenantId);
+        applyDeptFilter(wrapper, loginUser.getCurrentDeptId(), ReceiptPayment::getDeptId);
+        if (range != null) {
+            wrapper.ge(ReceiptPayment::getReceiptPaymentDate, range.start())
+                    .le(ReceiptPayment::getReceiptPaymentDate, range.end());
+        }
+        return defaultList(receiptPaymentMapper.selectList(wrapper));
+    }
+
+    private List<ReceiptPayment> queryReceiptsByLedgerIds(LoginUser loginUser, List<Long> ledgerIds) {
+        if (ledgerIds == null || ledgerIds.isEmpty()) {
+            return List.of();
+        }
+        LambdaQueryWrapper<ReceiptPayment> wrapper = new LambdaQueryWrapper<>();
+        applyTenantFilter(wrapper, loginUser.getTenantId(), ReceiptPayment::getTenantId);
+        applyDeptFilter(wrapper, loginUser.getCurrentDeptId(), ReceiptPayment::getDeptId);
+        wrapper.in(ReceiptPayment::getSalesLedgerId, ledgerIds);
+        return defaultList(receiptPaymentMapper.selectList(wrapper));
+    }
+
+    private List<ShippingInfo> queryShippingsByLedgerIds(LoginUser loginUser, List<Long> ledgerIds) {
+        if (ledgerIds == null || ledgerIds.isEmpty()) {
+            return List.of();
+        }
+        LambdaQueryWrapper<ShippingInfo> wrapper = new LambdaQueryWrapper<>();
+        applyTenantFilter(wrapper, loginUser.getTenantId(), ShippingInfo::getTenantId);
+        applyDeptFilter(wrapper, loginUser.getCurrentDeptId(), ShippingInfo::getDeptId);
+        wrapper.in(ShippingInfo::getSalesLedgerId, ledgerIds);
+        return defaultList(shippingInfoMapper.selectList(wrapper));
+    }
+
+    private Map<Long, BigDecimal> sumInvoiceAmounts(List<Long> ledgerIds) {
+        if (ledgerIds == null || ledgerIds.isEmpty()) {
+            return Map.of();
+        }
+        Map<Long, BigDecimal> result = new HashMap<>();
+        for (InvoiceLedgerDto item : defaultList(invoiceLedgerMapper.invoicedTotal(ledgerIds))) {
+            if (item.getSalesLedgerId() == null) {
+                continue;
+            }
+            result.merge(item.getSalesLedgerId().longValue(), defaultDecimal(item.getInvoiceTotal()), BigDecimal::add);
+        }
+        return result;
+    }
+
+    private Map<Long, BigDecimal> sumReceiptAmounts(LoginUser loginUser, List<Long> ledgerIds) {
+        Map<Long, BigDecimal> result = new HashMap<>();
+        for (ReceiptPayment item : queryReceiptsByLedgerIds(loginUser, ledgerIds)) {
+            if (item.getSalesLedgerId() == null) {
+                continue;
+            }
+            result.merge(item.getSalesLedgerId(), defaultDecimal(item.getReceiptPaymentAmount()), BigDecimal::add);
+        }
+        return result;
+    }
+
+    private boolean isLedgerFullyShipped(Long ledgerId, Map<Long, List<ShippingInfo>> shippingByLedgerId) {
+        List<ShippingInfo> shippingInfos = shippingByLedgerId.get(ledgerId);
+        if (shippingInfos == null || shippingInfos.isEmpty()) {
+            return false;
+        }
+        return shippingInfos.stream().allMatch(item -> isShippedStatus(item.getStatus()));
+    }
+
+    private String calcLedgerShippingStatus(List<ShippingInfo> shippingInfos) {
+        if (shippingInfos == null || shippingInfos.isEmpty()) {
+            return "鏈彂璐�";
+        }
+        long shippedCount = shippingInfos.stream().filter(item -> isShippedStatus(item.getStatus())).count();
+        if (shippedCount == 0) {
+            return "寰呭彂璐�";
+        }
+        if (shippedCount == shippingInfos.size()) {
+            return "宸插彂璐�";
+        }
+        return "閮ㄥ垎鍙戣揣";
+    }
+
+    private boolean isShippedStatus(String status) {
+        return StringUtils.hasText(status) && status.contains("宸插彂璐�");
+    }
+
+    private boolean matchCustomerKeyword(CustomerVo customer, String keyword) {
+        if (!StringUtils.hasText(keyword)) {
+            return true;
+        }
+        String text = keyword.trim();
+        return safe(customer.getCustomerName()).contains(text)
+                || safe(customer.getContactPerson()).contains(text)
+                || safe(customer.getContactPhone()).contains(text)
+                || safe(customer.getCompanyPhone()).contains(text)
+                || safe(customer.getUsageUserName()).contains(text);
+    }
+
+    private boolean matchInteractionKeyword(ReceiptPayment payment, SalesLedger ledger, String keyword) {
+        if (!StringUtils.hasText(keyword)) {
+            return true;
+        }
+        String text = keyword.trim();
+        return safe(payment.getRegistrant()).contains(text)
+                || (ledger != null && (safe(ledger.getCustomerName()).contains(text)
+                || safe(ledger.getSalesContractNo()).contains(text)
+                || safe(ledger.getProjectName()).contains(text)));
+    }
+
+    private boolean matchLedgerCustomerKeyword(SalesLedger ledger, String keyword) {
+        if (!StringUtils.hasText(keyword)) {
+            return true;
+        }
+        String text = keyword.trim();
+        return safe(ledger.getCustomerName()).contains(text)
+                || safe(ledger.getSalesContractNo()).contains(text)
+                || safe(ledger.getProjectName()).contains(text);
+    }
+
+    private Integer normalizeSeaType(String seaType) {
+        if (!StringUtils.hasText(seaType)) {
+            return null;
+        }
+        String value = seaType.trim().toLowerCase(Locale.ROOT);
+        return switch (value) {
+            case "private", "绉佹捣", "0" -> 0;
+            case "public", "鍏捣", "1" -> 1;
+            default -> null;
+        };
+    }
+
+    private String customerSeaTypeName(Integer type) {
+        if (type == null) {
+            return "鏈煡";
+        }
+        return type == 1 ? "鍏捣" : "绉佹捣";
+    }
+
+    private int normalizeLimit(Integer limit) {
+        if (limit == null || limit <= 0) {
+            return DEFAULT_LIMIT;
+        }
+        return Math.min(limit, MAX_LIMIT);
+    }
+
+    private boolean tenantMatched(Long dataTenantId, Long userTenantId) {
+        if (userTenantId == null) {
+            return true;
+        }
+        return Objects.equals(dataTenantId, userTenantId);
+    }
+
+    private <T> void applyTenantFilter(LambdaQueryWrapper<T> wrapper, Long tenantId, SFunction<T, Long> field) {
+        if (tenantId != null) {
+            wrapper.eq(field, tenantId);
+        }
+    }
+
+    private <T> void applyDeptFilter(LambdaQueryWrapper<T> wrapper, Long deptId, SFunction<T, Long> field) {
+        if (deptId != null) {
+            wrapper.eq(field, deptId);
+        }
+    }
+
+    private LoginUser currentLoginUser(String memoryId) {
+        LoginUser loginUser = aiSessionUserContext.get(memoryId);
+        if (loginUser != null) {
+            return loginUser;
+        }
+        return SecurityUtils.getLoginUser();
+    }
+
+    private DateRange resolveDateRange(String startDate, String endDate, String timeRange) {
+        LocalDate today = LocalDate.now();
+        LocalDate explicitStart = parseLocalDate(startDate);
+        LocalDate explicitEnd = parseLocalDate(endDate);
+        if (explicitStart != null || explicitEnd != null) {
+            LocalDate start = explicitStart != null ? explicitStart : explicitEnd;
+            LocalDate end = explicitEnd != null ? explicitEnd : explicitStart;
+            if (start.isAfter(end)) {
+                LocalDate temp = start;
+                start = end;
+                end = temp;
+            }
+            return new DateRange(start, end, start + "鑷�" + end);
+        }
+        if (!StringUtils.hasText(timeRange)) {
+            return new DateRange(today.minusDays(29), today, "杩�30澶�");
+        }
+        String text = timeRange.trim();
+        if (text.contains("浠婂ぉ")) {
+            return new DateRange(today, today, "浠婂ぉ");
+        }
+        if (text.contains("鏄ㄥぉ") || text.contains("鏄ㄦ棩")) {
+            LocalDate day = today.minusDays(1);
+            return new DateRange(day, day, "鏄ㄥぉ");
+        }
+        if (text.contains("鏈懆")) {
+            LocalDate start = today.minusDays(today.getDayOfWeek().getValue() - 1L);
+            return new DateRange(start, today, "鏈懆");
+        }
+        if (text.contains("涓婂懆")) {
+            LocalDate thisWeekStart = today.minusDays(today.getDayOfWeek().getValue() - 1L);
+            LocalDate start = thisWeekStart.minusWeeks(1);
+            LocalDate end = thisWeekStart.minusDays(1);
+            return new DateRange(start, end, "涓婂懆");
+        }
+        if (text.contains("鏈湀")) {
+            return new DateRange(today.withDayOfMonth(1), today, "鏈湀");
+        }
+        if (text.contains("涓婃湀")) {
+            YearMonth lastMonth = YearMonth.from(today).minusMonths(1);
+            return new DateRange(lastMonth.atDay(1), lastMonth.atEndOfMonth(), "涓婃湀");
+        }
+        if (text.contains("浠婂勾") || text.contains("鏈勾")) {
+            return new DateRange(today.withDayOfYear(1), today, "浠婂勾");
+        }
+        if (text.contains("鍘诲勾")) {
+            LocalDate start = today.minusYears(1).withDayOfYear(1);
+            LocalDate end = today.minusYears(1).withMonth(12).withDayOfMonth(31);
+            return new DateRange(start, end, "鍘诲勾");
+        }
+        Matcher relativeMatcher = RELATIVE_PATTERN.matcher(text);
+        if (relativeMatcher.find()) {
+            int amount = Integer.parseInt(relativeMatcher.group(2));
+            String unit = relativeMatcher.group(3);
+            LocalDate start = switch (unit) {
+                case "澶�" -> today.minusDays(Math.max(amount - 1L, 0));
+                case "鍛�" -> today.minusWeeks(Math.max(amount, 1)).plusDays(1);
+                case "涓湀", "鏈�" -> today.minusMonths(Math.max(amount, 1)).plusDays(1);
+                case "骞�" -> today.minusYears(Math.max(amount, 1)).plusDays(1);
+                default -> today.minusDays(29);
+            };
+            return new DateRange(start, today, "杩�" + amount + unit);
+        }
+        Matcher dateMatcher = DATE_PATTERN.matcher(text);
+        if (dateMatcher.find()) {
+            LocalDate start = parseLocalDate(dateMatcher.group(1));
+            LocalDate end = dateMatcher.find() ? parseLocalDate(dateMatcher.group(1)) : start;
+            if (start != null && end != null) {
+                if (start.isAfter(end)) {
+                    LocalDate temp = start;
+                    start = end;
+                    end = temp;
+                }
+                return new DateRange(start, end, start + "鑷�" + end);
+            }
+        }
+        return new DateRange(today.minusDays(29), today, "杩�30澶�");
+    }
+
+    private LocalDate parseLocalDate(String text) {
+        if (!StringUtils.hasText(text)) {
+            return null;
+        }
+        try {
+            return LocalDate.parse(text.trim(), DATE_FMT);
+        } catch (Exception ignored) {
+            return null;
+        }
+    }
+
+    private Date toDate(LocalDate localDate) {
+        return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
+    }
+
+    private Date toExclusiveEndDate(LocalDate localDate) {
+        return Date.from(localDate.plusDays(1).atStartOfDay(ZoneId.systemDefault()).toInstant());
+    }
+
+    private LocalDate toLocalDate(Date date) {
+        if (date == null) {
+            return null;
+        }
+        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+    }
+
+    private String formatDate(Date date) {
+        LocalDate localDate = toLocalDate(date);
+        return formatDate(localDate);
+    }
+
+    private String formatDate(LocalDate date) {
+        return date == null ? "" : date.format(DATE_FMT);
+    }
+
+    private String formatDateTime(LocalDateTime time) {
+        return time == null ? "" : time.toString().replace('T', ' ');
+    }
+
+    private BigDecimal defaultDecimal(BigDecimal value) {
+        return value == null ? BigDecimal.ZERO : value;
+    }
+
+    private BigDecimal maxZero(BigDecimal value) {
+        return value == null || value.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : value;
+    }
+
+    private String toRate(long numerator, long denominator) {
+        if (denominator <= 0) {
+            return "0.00%";
+        }
+        BigDecimal rate = new BigDecimal(numerator)
+                .multiply(ONE_HUNDRED)
+                .divide(new BigDecimal(denominator), 2, RoundingMode.HALF_UP);
+        return rate.toPlainString() + "%";
+    }
+
+    private String toPercent(BigDecimal decimal) {
+        if (decimal == null) {
+            return "0.00%";
+        }
+        BigDecimal rate = decimal.multiply(ONE_HUNDRED).setScale(2, RoundingMode.HALF_UP);
+        return rate.toPlainString() + "%";
+    }
+
+    private String safe(Object value) {
+        return value == null ? "" : String.valueOf(value).replace('\n', ' ').replace('\r', ' ').trim();
+    }
+
+    private <T> List<T> defaultList(List<T> list) {
+        return list == null ? List.of() : list;
+    }
+
+    private Map<String, Object> rangeSummary(DateRange range, int count, String keyword) {
+        Map<String, Object> summary = new LinkedHashMap<>();
+        summary.put("timeRange", range.label());
+        summary.put("startDate", range.start().toString());
+        summary.put("endDate", range.end().toString());
+        summary.put("count", count);
+        summary.put("keyword", safe(keyword));
+        return summary;
+    }
+
+    private Map<String, Object> buildAmountBarOption(BigDecimal contractAmount,
+                                                      BigDecimal quotationAmount,
+                                                      BigDecimal receivedAmount,
+                                                      BigDecimal pendingAmount) {
+        List<String> xData = List.of("鍚堝悓棰�", "鎶ヤ环棰�", "鍥炴棰�", "寰呭洖娆�");
+        List<BigDecimal> yData = List.of(contractAmount, quotationAmount, receivedAmount, pendingAmount);
+        Map<String, Object> option = new LinkedHashMap<>();
+        option.put("title", Map.of("text", "閿�鍞粡钀ラ噾棰濇瑙�", "left", "center"));
+        option.put("tooltip", Map.of("trigger", "axis"));
+        option.put("xAxis", Map.of("type", "category", "data", xData));
+        option.put("yAxis", Map.of("type", "value"));
+        option.put("series", List.of(Map.of("name", "閲戦", "type", "bar", "data", yData)));
+        return option;
+    }
+
+    private Map<String, Object> buildShippingPieOption(long shippedCount, long pendingCount) {
+        List<Map<String, Object>> data = List.of(
+                Map.of("name", "宸插彂璐�", "value", shippedCount),
+                Map.of("name", "鏈彂璐�", "value", pendingCount)
+        );
+        Map<String, Object> option = new LinkedHashMap<>();
+        option.put("title", Map.of("text", "鍙戣揣鐘舵�佸垎甯�", "left", "center"));
+        option.put("tooltip", Map.of("trigger", "item"));
+        option.put("series", List.of(Map.of("type", "pie", "radius", "60%", "data", data)));
+        return option;
+    }
+
+    private Map<String, Object> buildCustomerTopBarOption(List<Map<String, Object>> topCustomers) {
+        List<String> xData = new ArrayList<>();
+        List<BigDecimal> yData = new ArrayList<>();
+        for (Map<String, Object> item : topCustomers) {
+            xData.add(String.valueOf(item.get("customerName")));
+            yData.add((BigDecimal) item.get("contractAmount"));
+        }
+        Map<String, Object> option = new LinkedHashMap<>();
+        option.put("title", Map.of("text", "瀹㈡埛鍚堝悓棰漈OP5", "left", "center"));
+        option.put("tooltip", Map.of("trigger", "axis"));
+        option.put("xAxis", Map.of("type", "category", "data", xData));
+        option.put("yAxis", Map.of("type", "value"));
+        option.put("series", List.of(Map.of("name", "鍚堝悓棰�", "type", "bar", "data", yData)));
+        return option;
+    }
+
+    private Map<String, Object> buildContractTrendLineOption(List<String> labels, List<BigDecimal> values) {
+        Map<String, Object> option = new LinkedHashMap<>();
+        option.put("title", Map.of("text", "鍚堝悓棰濇湀搴﹁秼鍔�", "left", "center"));
+        option.put("tooltip", Map.of("trigger", "axis"));
+        option.put("xAxis", Map.of("type", "category", "data", labels));
+        option.put("yAxis", Map.of("type", "value"));
+        option.put("series", List.of(Map.of("name", "鍚堝悓棰�", "type", "line", "smooth", true, "data", values)));
+        return option;
+    }
+
+    private Map<String, Object> buildRiskLevelPieOption(long highCount, long mediumCount, long lowCount) {
+        List<Map<String, Object>> data = List.of(
+                Map.of("name", "楂橀闄�", "value", highCount),
+                Map.of("name", "涓闄�", "value", mediumCount),
+                Map.of("name", "浣庨闄�", "value", lowCount)
+        );
+        Map<String, Object> option = new LinkedHashMap<>();
+        option.put("title", Map.of("text", "瀹㈡埛椋庨櫓绛夌骇鍒嗗竷", "left", "center"));
+        option.put("tooltip", Map.of("trigger", "item"));
+        option.put("series", List.of(Map.of("name", "椋庨櫓绛夌骇", "type", "pie", "radius", "60%", "data", data)));
+        return option;
+    }
+
+    private Map<String, Object> buildRiskScoreBarOption(List<CustomerRiskMetric> metrics) {
+        List<String> xData = metrics.stream().map(CustomerRiskMetric::getCustomerName).collect(Collectors.toList());
+        List<Integer> yData = metrics.stream().map(CustomerRiskMetric::getRiskScore).collect(Collectors.toList());
+        Map<String, Object> option = new LinkedHashMap<>();
+        option.put("title", Map.of("text", "瀹㈡埛椋庨櫓鍒嗗��", "left", "center"));
+        option.put("tooltip", Map.of("trigger", "axis"));
+        option.put("xAxis", Map.of("type", "category", "data", xData));
+        option.put("yAxis", Map.of("type", "value", "max", 100));
+        option.put("series", List.of(Map.of("name", "椋庨櫓鍒嗗��", "type", "bar", "data", yData)));
+        return option;
+    }
+
+    private Map<String, Object> buildPendingAmountBarOption(List<CustomerRiskMetric> metrics) {
+        List<String> xData = metrics.stream().map(CustomerRiskMetric::getCustomerName).collect(Collectors.toList());
+        List<BigDecimal> yData = metrics.stream().map(CustomerRiskMetric::getPendingAmount).collect(Collectors.toList());
+        Map<String, Object> option = new LinkedHashMap<>();
+        option.put("title", Map.of("text", "瀹㈡埛寰呭洖娆炬帓鍚�", "left", "center"));
+        option.put("tooltip", Map.of("trigger", "axis"));
+        option.put("xAxis", Map.of("type", "category", "data", xData));
+        option.put("yAxis", Map.of("type", "value"));
+        option.put("series", List.of(Map.of("name", "寰呭洖娆�", "type", "bar", "data", yData)));
+        return option;
+    }
+
+    private Map<String, Object> buildPriorityPieOption(long high, long medium, long low) {
+        List<Map<String, Object>> data = List.of(
+                Map.of("name", "楂樹紭鍏堢骇", "value", high),
+                Map.of("name", "涓紭鍏堢骇", "value", medium),
+                Map.of("name", "浣庝紭鍏堢骇", "value", low)
+        );
+        Map<String, Object> option = new LinkedHashMap<>();
+        option.put("title", Map.of("text", "绛栫暐浼樺厛绾у垎甯�", "left", "center"));
+        option.put("tooltip", Map.of("trigger", "item"));
+        option.put("series", List.of(Map.of("name", "浼樺厛绾�", "type", "pie", "radius", "60%", "data", data)));
+        return option;
+    }
+
+    private String jsonResponse(boolean success,
+                                String type,
+                                String description,
+                                Map<String, Object> summary,
+                                Map<String, Object> data,
+                                Map<String, Object> charts) {
+        Map<String, Object> result = new LinkedHashMap<>();
+        result.put("success", success);
+        result.put("type", type);
+        result.put("description", description);
+        result.put("summary", summary == null ? Map.of() : summary);
+        result.put("data", data == null ? Map.of() : data);
+        result.put("charts", charts == null ? Map.of() : charts);
+        return JSON.toJSONString(result);
+    }
+
+    private record DateRange(LocalDate start, LocalDate end, String label) {
+    }
+
+    private record TrendData(List<String> labels, List<BigDecimal> values) {
+        private List<Map<String, Object>> toItemList() {
+            List<Map<String, Object>> items = new LinkedList<>();
+            for (int i = 0; i < labels.size(); i++) {
+                Map<String, Object> item = new LinkedHashMap<>();
+                item.put("month", labels.get(i));
+                item.put("amount", values.get(i));
+                items.add(item);
+            }
+            return items;
+        }
+    }
+
+    private static class CustomerRiskMetric {
+        private final String customerName;
+        private final List<Long> ledgerIds = new ArrayList<>();
+        private final Map<Long, LocalDate> deliveryDateByLedgerId = new HashMap<>();
+        private BigDecimal contractAmount = BigDecimal.ZERO;
+        private BigDecimal receivedAmount = BigDecimal.ZERO;
+        private BigDecimal pendingAmount = BigDecimal.ZERO;
+        private BigDecimal pendingRate = BigDecimal.ZERO;
+        private BigDecimal quoteAmount = BigDecimal.ZERO;
+        private BigDecimal topSingleOrderAmount = BigDecimal.ZERO;
+        private int orderCount;
+        private int quoteCount;
+        private LocalDate lastOrderDate;
+        private long daysSinceLastOrder;
+        private long overdueDeliveryCount;
+        private int riskScore;
+        private String riskLevel = "low";
+        private List<String> riskReasons = new ArrayList<>();
+
+        private CustomerRiskMetric(String customerName) {
+            this.customerName = customerName;
+        }
+
+        private String getCustomerName() {
+            return customerName;
+        }
+
+        private List<Long> getLedgerIds() {
+            return ledgerIds;
+        }
+
+        private Map<Long, LocalDate> getDeliveryDateByLedgerId() {
+            return deliveryDateByLedgerId;
+        }
+
+        private BigDecimal getContractAmount() {
+            return contractAmount;
+        }
+
+        private void setContractAmount(BigDecimal contractAmount) {
+            this.contractAmount = contractAmount;
+        }
+
+        private BigDecimal getReceivedAmount() {
+            return receivedAmount;
+        }
+
+        private void setReceivedAmount(BigDecimal receivedAmount) {
+            this.receivedAmount = receivedAmount;
+        }
+
+        private BigDecimal getPendingAmount() {
+            return pendingAmount;
+        }
+
+        private void setPendingAmount(BigDecimal pendingAmount) {
+            this.pendingAmount = pendingAmount;
+        }
+
+        private BigDecimal getPendingRate() {
+            return pendingRate;
+        }
+
+        private void setPendingRate(BigDecimal pendingRate) {
+            this.pendingRate = pendingRate;
+        }
+
+        private BigDecimal getQuoteAmount() {
+            return quoteAmount;
+        }
+
+        private void setQuoteAmount(BigDecimal quoteAmount) {
+            this.quoteAmount = quoteAmount;
+        }
+
+        private BigDecimal getTopSingleOrderAmount() {
+            return topSingleOrderAmount;
+        }
+
+        private void setTopSingleOrderAmount(BigDecimal topSingleOrderAmount) {
+            this.topSingleOrderAmount = topSingleOrderAmount;
+        }
+
+        private int getOrderCount() {
+            return orderCount;
+        }
+
+        private void setOrderCount(int orderCount) {
+            this.orderCount = orderCount;
+        }
+
+        private int getQuoteCount() {
+            return quoteCount;
+        }
+
+        private void setQuoteCount(int quoteCount) {
+            this.quoteCount = quoteCount;
+        }
+
+        private LocalDate getLastOrderDate() {
+            return lastOrderDate;
+        }
+
+        private void setLastOrderDate(LocalDate lastOrderDate) {
+            this.lastOrderDate = lastOrderDate;
+        }
+
+        private long getDaysSinceLastOrder() {
+            return daysSinceLastOrder;
+        }
+
+        private void setDaysSinceLastOrder(long daysSinceLastOrder) {
+            this.daysSinceLastOrder = daysSinceLastOrder;
+        }
+
+        private long getOverdueDeliveryCount() {
+            return overdueDeliveryCount;
+        }
+
+        private void setOverdueDeliveryCount(long overdueDeliveryCount) {
+            this.overdueDeliveryCount = overdueDeliveryCount;
+        }
+
+        private int getRiskScore() {
+            return riskScore;
+        }
+
+        private void setRiskScore(int riskScore) {
+            this.riskScore = riskScore;
+        }
+
+        private String getRiskLevel() {
+            return riskLevel;
+        }
+
+        private void setRiskLevel(String riskLevel) {
+            this.riskLevel = riskLevel;
+        }
+
+        private List<String> getRiskReasons() {
+            return riskReasons;
+        }
+
+        private void setRiskReasons(List<String> riskReasons) {
+            this.riskReasons = riskReasons;
+        }
+    }
+}
diff --git a/src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java b/src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java
index d0af196..cdd5e0a 100644
--- a/src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java
+++ b/src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java
@@ -2,7 +2,8 @@
 
 import com.ruoyi.approve.pojo.ApproveNode;
 import com.ruoyi.approve.service.IApproveNodeService;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.AllArgsConstructor;
@@ -15,7 +16,7 @@
 @RestController
 @RequestMapping("/approveNode")
 @AllArgsConstructor
-public class ApproveNodeController {
+public class ApproveNodeController extends BaseController {
 
     private IApproveNodeService approveNodeService;
 
@@ -26,8 +27,8 @@
      */
     @GetMapping("/details/{id}")
     @Operation(summary = "娴佺▼鐘舵�佽鎯�")
-    public AjaxResult details(@PathVariable String id) {
-        return AjaxResult.success(approveNodeService.details(id));
+    public R<?> details(@PathVariable String id) {
+        return R.ok(approveNodeService.details(id));
     }
 
     /**
@@ -38,9 +39,9 @@
     @PostMapping("/updateApproveNode")
     @Transactional(rollbackFor = Exception.class)
     @Operation(summary = "瀹℃壒鑺傜偣")
-    public AjaxResult updateApproveNode(@RequestBody ApproveNode approveNode) throws IOException {
+    public R<?> updateApproveNode(@RequestBody ApproveNode approveNode) throws IOException {
         approveNodeService.updateApproveNode(approveNode);
-        return AjaxResult.success();
+        return R.ok();
     }
 
     /**
@@ -49,9 +50,9 @@
      * @return
      */
     @PostMapping("/init")
-    public AjaxResult init(String id) {
+    public R<?> init(String id) {
         approveNodeService.initApproveNodes("",id,1L);
-        return AjaxResult.success();
+        return R.ok();
     }
 
 }
diff --git a/src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java b/src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java
index ed02564..5c2c09c 100644
--- a/src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java
+++ b/src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java
@@ -9,7 +9,9 @@
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.security.LoginUser;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.common.constant.HttpStatus;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.project.system.domain.SysDept;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
@@ -25,7 +27,7 @@
 @RequestMapping("/approveProcess")
 @AllArgsConstructor
 @Tag(name = "瀹℃壒")
-public class ApproveProcessController {
+public class ApproveProcessController extends BaseController {
 
     private IApproveProcessService approveProcessService;
     /**銆�
@@ -33,13 +35,13 @@
      * @return
      */
     @GetMapping("/getDept")
-    public AjaxResult getDept() {
+    public R<?> getDept() {
         Long userId = SecurityUtils.getUserId();
         LoginUser user = SecurityUtils.getLoginUser();
         Long[] deptIds = SecurityUtils.getDeptId();
 
         List<SysDept> sysDeptList = approveProcessService.selectDeptListByDeptIds(deptIds);
-        return AjaxResult.success(sysDeptList);
+        return R.ok(sysDeptList);
     }
 
     /**
@@ -50,13 +52,13 @@
     @PostMapping("/add")
     @Transactional(rollbackFor = Exception.class)
     @Operation(summary = "娣诲姞瀹℃壒")
-    public AjaxResult add(@RequestBody ApproveProcessVO approveProcessVO) throws Exception {
+    public R<?> add(@RequestBody ApproveProcessVO approveProcessVO) throws Exception {
         if (approveProcessVO == null) {
-            return AjaxResult.warn("鍙傛暟涓嶈兘涓虹┖");
+            return R.fail(HttpStatus.WARN,"鍙傛暟涓嶈兘涓虹┖");
         }
 
         approveProcessService.addApprove(approveProcessVO);
-        return AjaxResult.success("娣诲姞鎴愬姛");
+        return R.ok(null, "娣诲姞鎴愬姛");
     }
 
     /**
@@ -66,11 +68,11 @@
      */
     @GetMapping("/get")
     @Operation(summary = "瀹℃壒璇︽儏")
-    public AjaxResult get(ApproveGetAndUpdateVo approveGetAndUpdateVo){
+    public R<?> get(ApproveGetAndUpdateVo approveGetAndUpdateVo){
         if (approveGetAndUpdateVo.getId() == null || approveGetAndUpdateVo.getId().isEmpty()) {
-            return AjaxResult.warn("鍙傛暟涓嶈兘涓虹┖");
+            return R.fail(HttpStatus.WARN,"鍙傛暟涓嶈兘涓虹┖");
         }
-        return AjaxResult.success(approveProcessService.getApproveById(approveGetAndUpdateVo.getId()));
+        return R.ok(approveProcessService.getApproveById(approveGetAndUpdateVo.getId()));
     }
 
     /**
@@ -81,12 +83,12 @@
     @PostMapping("/update")
     @Transactional(rollbackFor = Exception.class)
     @Operation(summary = "鏇存柊瀹℃壒")
-    public AjaxResult update(@RequestBody ApproveGetAndUpdateVo approveGetAndUpdateVo) throws IOException {
+    public R<?> update(@RequestBody ApproveGetAndUpdateVo approveGetAndUpdateVo) throws IOException {
         if (approveGetAndUpdateVo == null) {
-            return AjaxResult.warn("鍙傛暟涓嶈兘涓虹┖");
+            return R.fail(HttpStatus.WARN,"鍙傛暟涓嶈兘涓虹┖");
         }
         approveProcessService.updateByApproveId(approveGetAndUpdateVo);
-        return AjaxResult.success("鎿嶄綔鎴愬姛");
+        return R.ok(null, "鎿嶄綔鎴愬姛");
     }
     /**
      * 鑾峰彇瀹℃壒鍒楄〃
@@ -94,8 +96,8 @@
      */
     @GetMapping("/list")
     @Operation(summary = "鑾峰彇瀹℃壒鍒楄〃")
-    public AjaxResult list(Page page, ApproveProcess approveProcess) {
-        return AjaxResult.success(approveProcessService.listAll(page, approveProcess));
+    public R<?> list(Page page, ApproveProcess approveProcess) {
+        return R.ok(approveProcessService.listAll(page, approveProcess));
     }
 
     /**
@@ -106,12 +108,12 @@
     @DeleteMapping("/deleteIds")
     @Operation(summary = "鍒犻櫎瀹℃壒")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult deleteIds(@RequestBody List<Long> ids) {
+    public R<?> deleteIds(@RequestBody List<Long> ids) {
         if (ids == null || ids.size() == 0) {
-            return AjaxResult.warn("鍙傛暟涓嶈兘涓虹┖");
+            return R.fail(HttpStatus.WARN,"鍙傛暟涓嶈兘涓虹┖");
         }
         approveProcessService.delApprove(ids);
-        return AjaxResult.success("鎿嶄綔鎴愬姛");
+        return R.ok(null, "鎿嶄綔鎴愬姛");
     }
 
     @Operation(summary = "鍏嚭绠$悊瀵煎嚭")
diff --git a/src/main/java/com/ruoyi/approve/controller/HolidaySettingsController.java b/src/main/java/com/ruoyi/approve/controller/HolidaySettingsController.java
index 97abe9f..dfe6a7d 100644
--- a/src/main/java/com/ruoyi/approve/controller/HolidaySettingsController.java
+++ b/src/main/java/com/ruoyi/approve/controller/HolidaySettingsController.java
@@ -7,7 +7,8 @@
 import com.ruoyi.approve.mapper.WorkingHoursSettingMapper;
 import com.ruoyi.approve.pojo.*;
 import com.ruoyi.approve.service.HolidaySettingsService;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import lombok.AllArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -17,7 +18,7 @@
 @RestController
 @RequestMapping("/holidaySettings")
 @AllArgsConstructor
-public class HolidaySettingsController {
+public class HolidaySettingsController extends BaseController {
     private HolidaySettingsService holidaySettingsService;
     private AnnualLeaveSettingMapper annualLeaveSettingMapper;
     private OvertimeSettingMapper overtimeSettingMapper;
@@ -28,70 +29,70 @@
      * @return
      */
     @GetMapping("/getList")
-    public AjaxResult getList(@RequestParam(defaultValue = "1") long current,
+    public R<?> getList(@RequestParam(defaultValue = "1") long current,
                               @RequestParam(defaultValue = "50") long size, HolidaySettings holidaySettings) {
         Page page = new Page(current, size);
-        return AjaxResult.success(holidaySettingsService.listpage(page,holidaySettings));
+        return R.ok(holidaySettingsService.listpage(page,holidaySettings));
     }
     /**銆�
      * 澧炴坊
      * @return
      */
     @PostMapping("/add")
-    public AjaxResult add(@RequestBody HolidaySettings holidaySettings){
-        return AjaxResult.success(holidaySettingsService.save(holidaySettings));
+    public R<?> add(@RequestBody HolidaySettings holidaySettings){
+        return R.ok(holidaySettingsService.save(holidaySettings));
     }
     /**
      * 鏇存柊
      * @return
      */
     @PostMapping("/update")
-    public AjaxResult update(@RequestBody HolidaySettings holidaySettings){
-        return AjaxResult.success(holidaySettingsService.updateById(holidaySettings));
+    public R<?> update(@RequestBody HolidaySettings holidaySettings){
+        return R.ok(holidaySettingsService.updateById(holidaySettings));
     }
     /**
      * 鍒犻櫎
      * @return
      */
     @DeleteMapping("/delete")
-    public AjaxResult delete(@RequestBody List<Long> ids){
-        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
-        return AjaxResult.success(holidaySettingsService.removeByIds(ids));
+    public R<?> delete(@RequestBody List<Long> ids){
+        if(CollectionUtils.isEmpty(ids)) return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        return R.ok(holidaySettingsService.removeByIds(ids));
     }
     /**銆�
      * 鑾峰彇骞村亣瑙勫垯鍒楄〃
      * @return
      */
     @GetMapping("/getAnnualLeaveSettingList")
-    public AjaxResult getAnnualLeaveSettingList(@RequestParam(defaultValue = "1") long current,
+    public R<?> getAnnualLeaveSettingList(@RequestParam(defaultValue = "1") long current,
                               @RequestParam(defaultValue = "50") long size, AnnualLeaveSetting annualLeaveSetting) {
         Page page = new Page(current, size);
-        return AjaxResult.success(annualLeaveSettingMapper.listPage(page,annualLeaveSetting));
+        return R.ok(annualLeaveSettingMapper.listPage(page,annualLeaveSetting));
     }
     /**銆�
      * 澧炴坊骞村亣瑙勫垯
      * @return
      */
     @PostMapping("/addAnnualLeaveSetting")
-    public AjaxResult addAnnualLeaveSetting(@RequestBody AnnualLeaveSetting annualLeaveSetting){
-        return AjaxResult.success(annualLeaveSettingMapper.insert(annualLeaveSetting));
+    public R<?> addAnnualLeaveSetting(@RequestBody AnnualLeaveSetting annualLeaveSetting){
+        return R.ok(annualLeaveSettingMapper.insert(annualLeaveSetting));
     }
     /**銆�
      * 鏇存柊骞村亣瑙勫垯
      * @return
      */
     @PostMapping("/updateAnnualLeaveSetting")
-    public AjaxResult updateAnnualLeaveSetting(@RequestBody AnnualLeaveSetting annualLeaveSetting){
-        return AjaxResult.success(annualLeaveSettingMapper.updateById(annualLeaveSetting));
+    public R<?> updateAnnualLeaveSetting(@RequestBody AnnualLeaveSetting annualLeaveSetting){
+        return R.ok(annualLeaveSettingMapper.updateById(annualLeaveSetting));
     }
     /**銆�
      * 鍒犻櫎骞村亣瑙勫垯
      * @return
      */
     @DeleteMapping("/deleteAnnualLeaveSetting")
-    public AjaxResult deleteAnnualLeaveSetting(@RequestBody List<Long> ids){
-        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
-        return AjaxResult.success(annualLeaveSettingMapper.deleteBatchIds(ids));
+    public R<?> deleteAnnualLeaveSetting(@RequestBody List<Long> ids){
+        if(CollectionUtils.isEmpty(ids)) return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        return R.ok(annualLeaveSettingMapper.deleteBatchIds(ids));
     }
 
     /**銆�
@@ -99,70 +100,70 @@
      * @return
      */
     @GetMapping("/getOvertimeSettingList")
-    public AjaxResult getOvertimeSettingList(@RequestParam(defaultValue = "1") long current,
+    public R<?> getOvertimeSettingList(@RequestParam(defaultValue = "1") long current,
                               @RequestParam(defaultValue = "50") long size, OvertimeSetting overtimeSetting) {
         Page page = new Page(current, size);
-        return AjaxResult.success(overtimeSettingMapper.listPage(page,overtimeSetting));
+        return R.ok(overtimeSettingMapper.listPage(page,overtimeSetting));
     }
     /**銆�
      * 澧炴坊鍔犵彮瑙勫垯
      * @return
      */
     @PostMapping("/addOvertimeSetting")
-    public AjaxResult addOvertimeSetting(@RequestBody OvertimeSetting overtimeSetting){
-        return AjaxResult.success(overtimeSettingMapper.insert(overtimeSetting));
+    public R<?> addOvertimeSetting(@RequestBody OvertimeSetting overtimeSetting){
+        return R.ok(overtimeSettingMapper.insert(overtimeSetting));
     }
     /**銆�
      * 鏇存柊鍔犵彮瑙勫垯
      * @return
      */
     @PostMapping("/updateOvertimeSetting")
-    public AjaxResult updateOvertimeSetting(@RequestBody OvertimeSetting overtimeSetting){
-        return AjaxResult.success(overtimeSettingMapper.updateById(overtimeSetting));
+    public R<?> updateOvertimeSetting(@RequestBody OvertimeSetting overtimeSetting){
+        return R.ok(overtimeSettingMapper.updateById(overtimeSetting));
     }
     /**銆�
      * 鍒犻櫎鍔犵彮瑙勫垯
      * @return
      */
     @DeleteMapping("/deleteOvertimeSetting")
-    public AjaxResult deleteOvertimeSetting(@RequestBody List<Long> ids){
-        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
-        return AjaxResult.success(overtimeSettingMapper.deleteBatchIds(ids));
+    public R<?> deleteOvertimeSetting(@RequestBody List<Long> ids){
+        if(CollectionUtils.isEmpty(ids)) return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        return R.ok(overtimeSettingMapper.deleteBatchIds(ids));
     }
     /**銆�
      * 鑾峰彇涓婄彮鏃堕棿璁剧疆-鐝埗瑙勫垯鍒楄〃
      * @return
      */
     @GetMapping("/getWorkingHoursSettingList")
-    public AjaxResult getWorkingHoursSettingList(@RequestParam(defaultValue = "1") long current,
+    public R<?> getWorkingHoursSettingList(@RequestParam(defaultValue = "1") long current,
                               @RequestParam(defaultValue = "50") long size, WorkingHoursSetting workingHoursSetting) {
         Page page = new Page(current, size);
-        return AjaxResult.success(workingHoursSettingMapper.listPage(page,workingHoursSetting));
+        return R.ok(workingHoursSettingMapper.listPage(page,workingHoursSetting));
     }
     /**銆�
      * 澧炴坊鐝埗瑙勫垯
      * @return
      */
     @PostMapping("/addWorkingHoursSetting")
-    public AjaxResult addWorkingHoursSetting(@RequestBody WorkingHoursSetting workingHoursSetting){
-        return AjaxResult.success(workingHoursSettingMapper.insert(workingHoursSetting));
+    public R<?> addWorkingHoursSetting(@RequestBody WorkingHoursSetting workingHoursSetting){
+        return R.ok(workingHoursSettingMapper.insert(workingHoursSetting));
     }
     /**銆�
      * 鏇存柊鐝埗瑙勫垯
      * @return
      */
     @PostMapping("/updateWorkingHoursSetting")
-    public AjaxResult updateWorkingHoursSetting(@RequestBody WorkingHoursSetting workingHoursSetting){
-        return AjaxResult.success(workingHoursSettingMapper.updateById(workingHoursSetting));
+    public R<?> updateWorkingHoursSetting(@RequestBody WorkingHoursSetting workingHoursSetting){
+        return R.ok(workingHoursSettingMapper.updateById(workingHoursSetting));
     }
     /**銆�
      * 鍒犻櫎鐝埗瑙勫垯
      * @return
      */
     @DeleteMapping("/deleteWorkingHoursSetting")
-    public AjaxResult deleteWorkingHoursSetting(@RequestBody List<Long> ids){
-        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
-        return AjaxResult.success(workingHoursSettingMapper.deleteBatchIds(ids));
+    public R<?> deleteWorkingHoursSetting(@RequestBody List<Long> ids){
+        if(CollectionUtils.isEmpty(ids)) return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        return R.ok(workingHoursSettingMapper.deleteBatchIds(ids));
     }
 
 
diff --git a/src/main/java/com/ruoyi/approve/controller/KnowledgeBaseController.java b/src/main/java/com/ruoyi/approve/controller/KnowledgeBaseController.java
index 3ebb782..dd12369 100644
--- a/src/main/java/com/ruoyi/approve/controller/KnowledgeBaseController.java
+++ b/src/main/java/com/ruoyi/approve/controller/KnowledgeBaseController.java
@@ -5,7 +5,8 @@
 import com.ruoyi.approve.pojo.KnowledgeBase;
 import com.ruoyi.approve.service.KnowledgeBaseService;
 import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import jakarta.servlet.http.HttpServletResponse;
@@ -18,7 +19,7 @@
 @RequestMapping("/knowledgeBase")
 @AllArgsConstructor
 @Tag(name = "鐭ヨ瘑搴撶鐞�")
-public class KnowledgeBaseController {
+public class KnowledgeBaseController extends BaseController {
     private KnowledgeBaseService knowledgeBaseService;
 
     /**銆�
@@ -26,35 +27,35 @@
      * @return
      */
     @GetMapping("/getList")
-    public AjaxResult getList(@RequestParam(defaultValue = "1") long current,
+    public R<?> 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 R.ok(knowledgeBaseService.listpage(page,knowledgeBase));
     }
     /**銆�
      * 澧炴坊
      * @return
      */
     @PostMapping("/add")
-    public AjaxResult add(@RequestBody KnowledgeBase knowledgeBase){
-        return AjaxResult.success(knowledgeBaseService.save(knowledgeBase));
+    public R<?> add(@RequestBody KnowledgeBase knowledgeBase){
+        return R.ok(knowledgeBaseService.save(knowledgeBase));
     }
     /**
      * 鏇存柊
      * @return
      */
     @PostMapping("/update")
-    public AjaxResult update(@RequestBody KnowledgeBase knowledgeBase){
-        return AjaxResult.success(knowledgeBaseService.updateById(knowledgeBase));
+    public R<?> update(@RequestBody KnowledgeBase knowledgeBase){
+        return R.ok(knowledgeBaseService.updateById(knowledgeBase));
     }
     /**
      * 鍒犻櫎
      * @return
      */
     @DeleteMapping("/delete")
-    public AjaxResult delete(@RequestBody List<Long> ids){
-        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
-        return AjaxResult.success(knowledgeBaseService.removeByIds(ids));
+    public R<?> delete(@RequestBody List<Long> ids){
+        if(CollectionUtils.isEmpty(ids)) return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        return R.ok(knowledgeBaseService.removeByIds(ids));
     }
 
     @Operation(summary = "鐭ヨ瘑搴撶鐞嗗鍑�")
diff --git a/src/main/java/com/ruoyi/approve/controller/NotificationManagementController.java b/src/main/java/com/ruoyi/approve/controller/NotificationManagementController.java
index a1796f8..2749dcf 100644
--- a/src/main/java/com/ruoyi/approve/controller/NotificationManagementController.java
+++ b/src/main/java/com/ruoyi/approve/controller/NotificationManagementController.java
@@ -8,7 +8,8 @@
 import com.ruoyi.approve.pojo.NotificationManagement;
 import com.ruoyi.approve.pojo.OnlineMeeting;
 import com.ruoyi.approve.service.NotificationManagementService;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import lombok.AllArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -18,7 +19,7 @@
 @RestController
 @RequestMapping("/notificationManagement")
 @AllArgsConstructor
-public class NotificationManagementController {
+public class NotificationManagementController extends BaseController {
     private NotificationManagementService notificationManagementService ;
     private OnlineMeetingMapper onlineMeetingMapper;
     private FileSharingMapper fileSharingMapper;
@@ -27,35 +28,35 @@
      * @return
      */
     @GetMapping("/getList")
-    public AjaxResult getList(@RequestParam(defaultValue = "1") long current,
+    public R<?> getList(@RequestParam(defaultValue = "1") long current,
                               @RequestParam(defaultValue = "50") long size, NotificationManagement notificationManagement) {
         Page page = new Page(current, size);
-        return AjaxResult.success(notificationManagementService.listpage(page,notificationManagement));
+        return R.ok(notificationManagementService.listpage(page,notificationManagement));
     }
     /**銆�
      * 澧炴坊
      * @return
      */
     @PostMapping("/add")
-    public AjaxResult add(@RequestBody NotificationManagement notificationManagement){
-        return AjaxResult.success(notificationManagementService.save(notificationManagement));
+    public R<?> add(@RequestBody NotificationManagement notificationManagement){
+        return R.ok(notificationManagementService.save(notificationManagement));
     }
     /**
      * 鏇存柊
      * @return
      */
     @PostMapping("/update")
-    public AjaxResult update(@RequestBody NotificationManagement notificationManagement){
-        return AjaxResult.success(notificationManagementService.updateById(notificationManagement));
+    public R<?> update(@RequestBody NotificationManagement notificationManagement){
+        return R.ok(notificationManagementService.updateById(notificationManagement));
     }
     /**
      * 鍒犻櫎
      * @return
      */
     @DeleteMapping("/delete")
-    public AjaxResult delete(@RequestBody List<Long> ids){
-        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
-        return AjaxResult.success(notificationManagementService.removeByIds(ids));
+    public R<?> delete(@RequestBody List<Long> ids){
+        if(CollectionUtils.isEmpty(ids)) return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        return R.ok(notificationManagementService.removeByIds(ids));
     }
     /**
      *鏂板浼氳
@@ -63,16 +64,16 @@
      * @return
      */
     @PostMapping("/addOnlineMeeting")
-    public AjaxResult addOnlineMeeting(@RequestBody OnlineMeeting onlineMeeting){
-        return AjaxResult.success(onlineMeetingMapper.insert(onlineMeeting));
+    public R<?> addOnlineMeeting(@RequestBody OnlineMeeting onlineMeeting){
+        return R.ok(onlineMeetingMapper.insert(onlineMeeting));
     }
     /**
      *鏂板鏂囦欢鍏变韩
      *
      */
     @PostMapping("/addFileSharing")
-    public AjaxResult addFileSharing(@RequestBody FileSharing fileSharing){
-        return AjaxResult.success(fileSharingMapper.insert(fileSharing));
+    public R<?> addFileSharing(@RequestBody FileSharing fileSharing){
+        return R.ok(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..1e26526 100644
--- a/src/main/java/com/ruoyi/approve/controller/RpaProcessAutomationController.java
+++ b/src/main/java/com/ruoyi/approve/controller/RpaProcessAutomationController.java
@@ -5,7 +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.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import jakarta.servlet.http.HttpServletResponse;
@@ -18,42 +19,42 @@
 @RequestMapping("/rpaProcessAutomation")
 @AllArgsConstructor
 @Tag(name = "RPA娴佺▼鑷姩鍖�")
-public class RpaProcessAutomationController {
+public class RpaProcessAutomationController extends BaseController {
     private RpaProcessAutomationService rpaProcessAutomationService;
     /**銆�
      * 鑾峰彇鍒楄〃
      * @return
      */
     @GetMapping("/getList")
-    public AjaxResult getList(@RequestParam(defaultValue = "1") long current,
+    public R<?> getList(@RequestParam(defaultValue = "1") long current,
                               @RequestParam(defaultValue = "100") long size, RpaProcessAutomation rpaProcessAutomation) {
         Page page = new Page(current, size);
-        return AjaxResult.success(rpaProcessAutomationService.listpage(page,rpaProcessAutomation));
+        return R.ok(rpaProcessAutomationService.listpage(page,rpaProcessAutomation));
     }
     /**銆�
      * 澧炴坊
      * @return
      */
     @PostMapping("/add")
-    public AjaxResult add(@RequestBody RpaProcessAutomation rpaProcessAutomation){
-        return AjaxResult.success(rpaProcessAutomationService.save(rpaProcessAutomation));
+    public R<?> add(@RequestBody RpaProcessAutomation rpaProcessAutomation){
+        return R.ok(rpaProcessAutomationService.save(rpaProcessAutomation));
     }
     /**
      * 鏇存柊
      * @return
      */
     @PostMapping("/update")
-    public AjaxResult update(@RequestBody RpaProcessAutomation rpaProcessAutomation){
-        return AjaxResult.success(rpaProcessAutomationService.updateById(rpaProcessAutomation));
+    public R<?> update(@RequestBody RpaProcessAutomation rpaProcessAutomation){
+        return R.ok(rpaProcessAutomationService.updateById(rpaProcessAutomation));
     }
     /**
      * 鍒犻櫎
      * @return
      */
     @DeleteMapping("/delete")
-    public AjaxResult delete(@RequestBody List<Long> ids){
-        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
-        return AjaxResult.success(rpaProcessAutomationService.removeByIds(ids));
+    public R<?> delete(@RequestBody List<Long> ids){
+        if(CollectionUtils.isEmpty(ids)) return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        return R.ok(rpaProcessAutomationService.removeByIds(ids));
     }
 
     @Operation(summary = "RPA娴佺▼鑷姩鍖栧鍑�")
diff --git a/src/main/java/com/ruoyi/basic/controller/CustomerFollowUpController.java b/src/main/java/com/ruoyi/basic/controller/CustomerFollowUpController.java
index a5dcc83..bc829fd 100644
--- a/src/main/java/com/ruoyi/basic/controller/CustomerFollowUpController.java
+++ b/src/main/java/com/ruoyi/basic/controller/CustomerFollowUpController.java
@@ -11,7 +11,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.AllArgsConstructor;
 import org.springframework.web.bind.annotation.*;
@@ -55,8 +55,8 @@
      */
     @Operation(summary = "鑾峰彇瀹㈡埛璺熻繘璇︾粏淇℃伅")
     @GetMapping(value = "/{id}")
-    public AjaxResult getInfo(@PathVariable("id") Integer id) {
-        return AjaxResult.success(customerFollowUpService.getFollowUpWithFiles(id));
+    public R getInfo(@PathVariable("id") Integer id) {
+        return R.ok(customerFollowUpService.getFollowUpWithFiles(id));
     }
 
     /**
@@ -65,8 +65,8 @@
     @PostMapping("/add")
     @Operation(summary = "鏂板瀹㈡埛璺熻繘")
     @Log(title = "瀹㈡埛璺熻繘-鏂板", businessType = BusinessType.INSERT)
-    public AjaxResult add(@RequestBody CustomerFollowUp customerFollowUp) {
-        return toAjax(customerFollowUpService.insertCustomerFollowUp(customerFollowUp));
+    public R<?> add(@RequestBody CustomerFollowUp customerFollowUp) {
+        return R.ok();
     }
 
     /**
@@ -75,8 +75,8 @@
     @PutMapping("/edit")
     @Operation(summary = "淇敼瀹㈡埛璺熻繘")
     @Log(title = "瀹㈡埛璺熻繘-淇敼", businessType = BusinessType.UPDATE)
-    public AjaxResult edit(@RequestBody CustomerFollowUp customerFollowUp) {
-        return toAjax(customerFollowUpService.updateCustomerFollowUp(customerFollowUp));
+    public R<?> edit(@RequestBody CustomerFollowUp customerFollowUp) {
+        return R.ok();
     }
 
     /**
@@ -85,8 +85,8 @@
     @Operation(summary = "涓婁紶璺熻繘闄勪欢")
     @PostMapping("/upload/{followUpId}")
     @Log(title = "瀹㈡埛璺熻繘-涓婁紶闄勪欢", businessType = BusinessType.INSERT)
-    public AjaxResult uploadFiles(@RequestParam("files") List<MultipartFile> files, @PathVariable Integer followUpId) {
-        return AjaxResult.success(customerFollowUpService.addFollowUpFiles(files, followUpId));
+    public R uploadFiles(@RequestParam("files") List<MultipartFile> files, @PathVariable Integer followUpId) {
+        return R.ok(customerFollowUpService.addFollowUpFiles(files, followUpId));
     }
 
     /**
@@ -95,9 +95,9 @@
     @Operation(summary = "涓婁紶闄勪欢(澶嶇敤)")
     @PostMapping("/upload")
     @Log(title = "涓婁紶闄勪欢(澶嶇敤)", businessType = BusinessType.INSERT)
-    public AjaxResult uploadFiles(@RequestParam("files") List<MultipartFile> files, @RequestParam(required = false) String name) {
+    public R uploadFiles(@RequestParam("files") List<MultipartFile> files, @RequestParam(required = false) String name) {
         List<CustomerFollowUpFileDto> uploadedFiles = customerFollowUpService.addFollowUpFiles(files, null);
-        return AjaxResult.success(uploadedFiles);
+        return R.ok(uploadedFiles);
     }
 
     /**
@@ -105,8 +105,8 @@
      */
     @Operation(summary = "鎵归噺鏌ヨ闄勪欢鍒楄〃")
     @PostMapping("/file/list")
-    public AjaxResult getFileList(@RequestBody List<Long> ids) {
-        return AjaxResult.success(customerFollowUpService.getFollowUpFilesByIds(ids));
+    public R getFileList(@RequestBody List<Long> ids) {
+        return R.ok(customerFollowUpService.getFollowUpFilesByIds(ids));
     }
 
     /**
@@ -115,9 +115,9 @@
     @Operation(summary = "鍒犻櫎璺熻繘闄勪欢")
     @DeleteMapping("/file/{fileId}")
     @Log(title = "瀹㈡埛璺熻繘-鍒犻櫎闄勪欢", businessType = BusinessType.DELETE)
-    public AjaxResult deleteFile(@PathVariable Integer fileId) {
+    public R deleteFile(@PathVariable Integer fileId) {
         customerFollowUpService.deleteFollowUpFile(fileId);
-        return AjaxResult.success();
+        return R.ok();
     }
 
     /**
@@ -126,8 +126,8 @@
     @Operation(summary = "鍒犻櫎瀹㈡埛璺熻繘")
     @DeleteMapping("/{id}")
     @Log(title = "瀹㈡埛璺熻繘-鍒犻櫎", businessType = BusinessType.DELETE)
-    public AjaxResult remove(@PathVariable Integer id) {
-        return toAjax(customerFollowUpService.deleteCustomerFollowUpById(id));
+    public R remove(@PathVariable Integer id) {
+        return R.ok(customerFollowUpService.deleteCustomerFollowUpById(id));
     }
 
     /**
@@ -136,8 +136,8 @@
     @Operation(summary = "鏂板/鏇存柊鍥炶鎻愰啋")
     @PostMapping("/return-visit")
     @Log(title = "鍥炶鎻愰啋-鏂板/鏇存柊", businessType = BusinessType.UPDATE)
-    public AjaxResult saveReturnVisit(@RequestBody CustomerReturnVisit customerReturnVisit) {
-        return toAjax(customerReturnVisitService.saveOrUpdateReturnVisit(customerReturnVisit));
+    public R saveReturnVisit(@RequestBody CustomerReturnVisit customerReturnVisit) {
+        return  R.ok(customerReturnVisitService.saveOrUpdateReturnVisit(customerReturnVisit));
     }
 
     /**
@@ -145,8 +145,8 @@
      */
     @Operation(summary = "鑾峰彇鍥炶鎻愰啋璇︽儏")
     @GetMapping("/return-visit/{customerId}")
-    public AjaxResult getReturnVisit(@PathVariable Integer customerId) {
-        return AjaxResult.success(customerReturnVisitService.getByCustomerId(customerId));
+    public R getReturnVisit(@PathVariable Integer customerId) {
+        return R.ok(customerReturnVisitService.getByCustomerId(customerId));
     }
 
     /**
@@ -155,9 +155,9 @@
     @Operation(summary = "鏍囪鍥炶鎻愰啋宸茶")
     @PutMapping("/return-visit/read/{id}")
     @Log(title = "鍥炶鎻愰啋-鏍囪宸茶", businessType = BusinessType.UPDATE)
-    public AjaxResult markAsRead(@PathVariable Long id) {
+    public R markAsRead(@PathVariable Long id) {
         customerReturnVisitService.markAsRead(id);
-        return AjaxResult.success();
+        return R.ok();
     }
 
 }
diff --git a/src/main/java/com/ruoyi/basic/controller/ProductController.java b/src/main/java/com/ruoyi/basic/controller/ProductController.java
index 1c5224b..5109662 100644
--- a/src/main/java/com/ruoyi/basic/controller/ProductController.java
+++ b/src/main/java/com/ruoyi/basic/controller/ProductController.java
@@ -15,7 +15,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.service.ISalesLedgerProductService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -55,8 +55,9 @@
      */
     @Log(title = "浜у搧", businessType = BusinessType.INSERT)
     @PostMapping("/addOrEditProduct")
-    public AjaxResult addOrEditProduct(@RequestBody ProductDto productDto) {
-        return toAjax(productService.addOrEditProduct(productDto));
+    public R<?> addOrEditProduct(@RequestBody ProductDto productDto) {
+        productService.addOrEditProduct(productDto);
+        return R.ok();
     }
 
     /**
@@ -64,8 +65,9 @@
      */
     @Log(title = "浜у搧瑙勬牸鍨嬪彿", businessType = BusinessType.INSERT)
     @PostMapping("/addOrEditProductModel")
-    public AjaxResult addOrEditProductModel(@RequestBody ProductModelDto productModelDto) {
-        return toAjax(productModelService.addOrEditProductModel(productModelDto));
+    public R<?> addOrEditProductModel(@RequestBody ProductModelDto productModelDto) {
+        productModelService.addOrEditProductModel(productModelDto);
+        return R.ok();
     }
 
     /**
@@ -73,18 +75,19 @@
      */
     @Log(title = "浜у搧", businessType = BusinessType.DELETE)
     @DeleteMapping("/delProduct")
-    public AjaxResult remove(@RequestBody Long[] ids) {
+    public R<?> remove(@RequestBody Long[] ids) {
         if (ids == null || ids.length == 0) {
-            return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+            return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
         }
         // 妫�鏌ユ槸鍚︽湁閿�鍞晢鍝佽褰曞叧鑱旇浜у搧
         LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.in(SalesLedgerProduct::getProductId, ids);
         List<SalesLedgerProduct> salesLedgerProductList = salesLedgerProductService.list(queryWrapper);
         if (salesLedgerProductList.size() > 0) {
-            return AjaxResult.error("璇ヤ骇鍝佸瓨鍦ㄩ攢鍞�/閲囪喘璁板綍锛屼笉鑳藉垹闄�");
+            return R.fail("璇ヤ骇鍝佸瓨鍦ㄩ攢鍞�/閲囪喘璁板綍锛屼笉鑳藉垹闄�");
         }
-        return toAjax(productService.delProductByIds(ids));
+        productService.delProductByIds(ids);
+        return R.ok();
     }
 
     /**
@@ -92,18 +95,19 @@
      */
     @Log(title = "浜у搧瑙勬牸鍨嬪彿", businessType = BusinessType.DELETE)
     @DeleteMapping("/delProductModel")
-    public AjaxResult delProductModel(@RequestBody Long[] ids) {
+    public R<?> delProductModel(@RequestBody Long[] ids) {
         if (ids == null || ids.length == 0) {
-            return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+            return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
         }
         // 妫�鏌ユ槸鍚︽湁閿�鍞晢鍝佽褰曞叧鑱旇浜у搧瑙勬牸鍨嬪彿
         LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.in(SalesLedgerProduct::getProductModelId, ids);
         List<SalesLedgerProduct> salesLedgerProductList = salesLedgerProductService.list(queryWrapper);
         if (salesLedgerProductList.size() > 0) {
-            return AjaxResult.error("璇ヤ骇鍝佽鏍煎瀷鍙峰瓨鍦ㄩ攢鍞�/閲囪喘璁板綍锛屼笉鑳藉垹闄�");
+            return R.fail("璇ヤ骇鍝佽鏍煎瀷鍙峰瓨鍦ㄩ攢鍞�/閲囪喘璁板綍锛屼笉鑳藉垹闄�");
         }
-        return toAjax(productModelService.delProductModel(ids));
+        productModelService.delProductModel(ids);
+        return R.ok();
     }
 
     /**
@@ -125,7 +129,7 @@
      */
     @PostMapping("/import")
     @Log(title = "瀵煎叆浜у搧", businessType = BusinessType.IMPORT)
-    public AjaxResult importProductModel(@RequestParam("file") MultipartFile file, Integer productId) {
+    public R<?> importProductModel(@RequestParam("file") MultipartFile file, Integer productId) {
         return productModelService.importProductModel(file, productId);
     }
 
diff --git a/src/main/java/com/ruoyi/basic/controller/SupplierManageController.java b/src/main/java/com/ruoyi/basic/controller/SupplierManageController.java
index 1a58500..f1a45d1 100644
--- a/src/main/java/com/ruoyi/basic/controller/SupplierManageController.java
+++ b/src/main/java/com/ruoyi/basic/controller/SupplierManageController.java
@@ -7,7 +7,7 @@
 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.framework.web.domain.R;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.AllArgsConstructor;
 import org.springframework.util.CollectionUtils;
@@ -29,9 +29,9 @@
      * @return
      */
     @PostMapping("/add")
-    public AjaxResult add(@RequestBody SupplierManage supplierManage) {
+    public R add(@RequestBody SupplierManage supplierManage) {
         supplierService.saveSupplier(supplierManage);
-        return AjaxResult.success();
+        return R.ok();
     }
 
     /**
@@ -40,12 +40,12 @@
      * @return
      */
     @DeleteMapping("/del")
-    public AjaxResult delSupplier(@RequestBody List<Integer> ids) {
+    public R delSupplier(@RequestBody List<Integer> ids) {
         if(CollectionUtils.isEmpty(ids)){
-            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+            return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         }
         supplierService.delSupplier(ids);
-        return AjaxResult.success();
+        return R.ok();
     }
 
     /**
@@ -54,8 +54,8 @@
      * @return
      */
     @GetMapping("/{id}")
-    public AjaxResult supplierDetail(@PathVariable("id") Integer id) {
-        return AjaxResult.success(supplierService.supplierDetail(id));
+    public R supplierDetail(@PathVariable("id") Integer id) {
+        return R.ok(supplierService.supplierDetail(id));
     }
 
     /**
@@ -64,9 +64,9 @@
      * @return
      */
     @PostMapping("/update")
-    public AjaxResult update(@RequestBody SupplierManage supplierManage) {
+    public R update(@RequestBody SupplierManage supplierManage) {
         supplierService.supplierUpdate(supplierManage);
-        return AjaxResult.success();
+        return R.ok();
     }
 
     /**
@@ -76,8 +76,8 @@
      * @return
      */
     @GetMapping("/listPage")
-    public AjaxResult supplierListPage(Page page, SupplierManageDto supplierManageDto) {
-        return AjaxResult.success(supplierService.supplierListPage(page, supplierManageDto));
+    public R supplierListPage(Page page, SupplierManageDto supplierManageDto) {
+        return R.ok(supplierService.supplierListPage(page, supplierManageDto));
     }
 
     /**
@@ -102,12 +102,8 @@
      */
     @PostMapping("/import")
     @Log(title = "渚涘簲鍟嗗鍏�", businessType = BusinessType.IMPORT)
-    public AjaxResult importData(MultipartFile file) {
-        Boolean b = supplierService.importData(file);
-        if (b) {
-            return AjaxResult.success("瀵煎叆鎴愬姛");
-        }
-        return AjaxResult.error("瀵煎叆澶辫触");
+    public R importData(MultipartFile file) throws Exception {
+       return supplierService.importData(file);
     }
 
 
@@ -116,7 +112,7 @@
      * @return
      */
     @GetMapping("/getOptions")
-    public AjaxResult getOptions() {
-        return AjaxResult.success(supplierService.list());
+    public R getOptions() {
+        return R.ok(supplierService.list());
     }
 }
diff --git a/src/main/java/com/ruoyi/basic/controller/SupplierManageFileController.java b/src/main/java/com/ruoyi/basic/controller/SupplierManageFileController.java
index 2d43f65..3829aa4 100644
--- a/src/main/java/com/ruoyi/basic/controller/SupplierManageFileController.java
+++ b/src/main/java/com/ruoyi/basic/controller/SupplierManageFileController.java
@@ -3,7 +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.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
@@ -15,7 +16,7 @@
  */
 @RestController
 @RequestMapping("/basic/supplierManageFile")
-public class SupplierManageFileController {
+public class SupplierManageFileController extends BaseController {
 
 
     @Resource
@@ -28,8 +29,8 @@
      * @return
      */
     @PostMapping("/add")
-    public AjaxResult add(@RequestBody SupplierManageFile supplierManageFile) {
-        return AjaxResult.success(supplierManageFileService.save(supplierManageFile));
+    public R<?> add(@RequestBody SupplierManageFile supplierManageFile) {
+        return R.ok(supplierManageFileService.save(supplierManageFile));
     }
 
     /**
@@ -38,12 +39,12 @@
      * @return
      */
     @DeleteMapping("/del")
-    public AjaxResult delSupplierManageFile(@RequestBody List<Integer> ids) {
+    public R<?> delSupplierManageFile(@RequestBody List<Integer> ids) {
         if(CollectionUtils.isEmpty(ids)){
-            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+            return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         }
         //鍒犻櫎妫�楠岄檮浠�
-        return AjaxResult.success(supplierManageFileService.removeBatchByIds(ids));
+        return R.ok(supplierManageFileService.removeBatchByIds(ids));
     }
 
     /**
@@ -53,8 +54,8 @@
      * @return
      */
     @GetMapping("/listPage")
-    public AjaxResult supplierManageFileListPage(Page page, SupplierManageFile supplierManageFile) {
-        return AjaxResult.success(supplierManageFileService.supplierManageFileListPage(page, supplierManageFile));
+    public R<?> supplierManageFileListPage(Page page, SupplierManageFile supplierManageFile) {
+        return R.ok(supplierManageFileService.supplierManageFileListPage(page, supplierManageFile));
     }
 
 
diff --git a/src/main/java/com/ruoyi/basic/excel/SupplierManageExcelDto.java b/src/main/java/com/ruoyi/basic/excel/SupplierManageExcelDto.java
index 87b197f..d4e63de 100644
--- a/src/main/java/com/ruoyi/basic/excel/SupplierManageExcelDto.java
+++ b/src/main/java/com/ruoyi/basic/excel/SupplierManageExcelDto.java
@@ -15,6 +15,9 @@
     @Excel(name = "渚涘簲鍟嗗悕绉�")
     private String supplierName;
 
+    @Excel(name = "渚涘簲鍟嗙被鍨�")
+    private String supplierType;
+
     @Excel(name = "绾崇◣浜鸿瘑鍒彿")
     private String taxpayerIdentificationNum;
 
diff --git a/src/main/java/com/ruoyi/basic/pojo/SupplierManage.java b/src/main/java/com/ruoyi/basic/pojo/SupplierManage.java
index fa10c92..cb32b58 100644
--- a/src/main/java/com/ruoyi/basic/pojo/SupplierManage.java
+++ b/src/main/java/com/ruoyi/basic/pojo/SupplierManage.java
@@ -20,6 +20,11 @@
     @Excel(name = "渚涘簲鍟嗗悕绉�")
     private String supplierName;
 
+    @Schema(description = "渚涘簲鍟嗙被鍨�")
+    @TableField(value = "supplier_type")
+    @Excel(name = "渚涘簲鍟嗙被鍨�")
+    private String supplierType;
+
     @Schema(description = "绾崇◣浜鸿瘑鍒彿")
     @Excel(name = "绾崇◣浜鸿瘑鍒彿")
     private String taxpayerIdentificationNum;
@@ -79,10 +84,6 @@
     @Schema(description = "绉熸埛ID")
     @TableField(fill = FieldFill.INSERT)
     private Long tenantId;
-
-    @Schema(description = "渚涘簲鍟嗙被鍨�")
-    @TableField(value = "supplier_type")
-    private String supplierType;
 
     @TableField(fill = FieldFill.INSERT)
     private Long deptId;
diff --git a/src/main/java/com/ruoyi/basic/service/IProductModelService.java b/src/main/java/com/ruoyi/basic/service/IProductModelService.java
index dd268d6..6b96d61 100644
--- a/src/main/java/com/ruoyi/basic/service/IProductModelService.java
+++ b/src/main/java/com/ruoyi/basic/service/IProductModelService.java
@@ -6,7 +6,7 @@
 import com.ruoyi.basic.dto.ProductDto;
 import com.ruoyi.basic.dto.ProductModelDto;
 import com.ruoyi.basic.pojo.ProductModel;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
@@ -34,5 +34,5 @@
      */
     IPage<ProductModel> modelListPage(Page page , ProductDto productDto);
 
-    AjaxResult importProductModel(MultipartFile file, Integer productId);
+    R<?> importProductModel(MultipartFile file, Integer productId);
 }
diff --git a/src/main/java/com/ruoyi/basic/service/ISupplierService.java b/src/main/java/com/ruoyi/basic/service/ISupplierService.java
index b54c2ad..02b7d91 100644
--- a/src/main/java/com/ruoyi/basic/service/ISupplierService.java
+++ b/src/main/java/com/ruoyi/basic/service/ISupplierService.java
@@ -5,7 +5,7 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.basic.dto.SupplierManageDto;
 import com.ruoyi.basic.pojo.SupplierManage;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import org.springframework.web.multipart.MultipartFile;
 
 import jakarta.servlet.http.HttpServletResponse;
@@ -56,5 +56,5 @@
      */
     void supplierExport(HttpServletResponse response, SupplierManageDto supplierManageDto);
 
-    Boolean importData(MultipartFile file);
+    R importData(MultipartFile file);
 }
diff --git a/src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
index be34fc0..263a52a 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
+++ b/src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
@@ -17,7 +17,7 @@
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.sales.dto.LossProductModelDto;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
@@ -124,14 +124,14 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult importProductModel(MultipartFile file, Integer productId) {
+    public R<?> importProductModel(MultipartFile file, Integer productId) {
         if (productId == null) {
-            return AjaxResult.error("璇峰厛閫夋嫨浜у搧鍐嶅鍏ヨ鏍煎瀷鍙�");
+            return R.fail("璇峰厛閫夋嫨浜у搧鍐嶅鍏ヨ鏍煎瀷鍙�");
         }
 
         Product product = productMapper.selectById(productId);
         if (product == null) {
-            return AjaxResult.error("閫夋嫨鐨勪骇鍝佷笉瀛樺湪");
+            return R.fail("閫夋嫨鐨勪骇鍝佷笉瀛樺湪");
         }
 
         try {
@@ -139,7 +139,7 @@
             List<ProductModel> productModelList = productModelExcelUtil.importExcel(file.getInputStream());
 
             if (CollectionUtils.isEmpty(productModelList)) {
-                return AjaxResult.error("瀵煎叆鏁版嵁涓嶈兘涓虹┖");
+                return R.fail("瀵煎叆鏁版嵁涓嶈兘涓虹┖");
             }
 
             //  鑾峰彇褰撳墠浜у搧涓嬫墍鏈夌殑瑙勬牸鍨嬪彿鍚�
@@ -154,13 +154,13 @@
                 int rowNum = i + 2;
 
                 if (StringUtils.isEmpty(item.getProductCode())) {
-                    return AjaxResult.error("绗� " + rowNum + " 琛屽鍏ュけ璐�: [浜у搧缂栫爜] 涓嶈兘涓虹┖");
+                    return R.fail("绗� " + rowNum + " 琛屽鍏ュけ璐�: [浜у搧缂栫爜] 涓嶈兘涓虹┖");
                 }
                 if (StringUtils.isEmpty(item.getModel())) {
-                    return AjaxResult.error("绗� " + rowNum + " 琛屽鍏ュけ璐�: [瑙勬牸鍨嬪彿] 涓嶈兘涓虹┖");
+                    return R.fail("绗� " + rowNum + " 琛屽鍏ュけ璐�: [瑙勬牸鍨嬪彿] 涓嶈兘涓虹┖");
                 }
                 if (StringUtils.isEmpty(item.getUnit())) {
-                    return AjaxResult.error("绗� " + rowNum + " 琛屽鍏ュけ璐�: [鍗曚綅] 涓嶈兘涓虹┖");
+                    return R.fail("绗� " + rowNum + " 琛屽鍏ュけ璐�: [鍗曚綅] 涓嶈兘涓虹┖");
                 }
 
                 //  鍘婚噸,濡傛灉宸插寘鍚鍨嬪彿,鍒欒烦杩�
@@ -180,9 +180,9 @@
             }
 
             if (skipCount == 0) {
-                return AjaxResult.success(String.format("鎴愬姛瀵煎叆 %d 鏉℃暟鎹�", waitToSaveList.size()));
+                return R.ok(null, String.format("鎴愬姛瀵煎叆 %d 鏉℃暟鎹�", waitToSaveList.size()));
             } else {
-                return AjaxResult.success(String.format("鎴愬姛瀵煎叆 %d 鏉★紝璺宠繃宸插瓨鍦ㄦ暟鎹� %d 鏉�", waitToSaveList.size(), skipCount));
+                return R.ok(null, String.format("鎴愬姛瀵煎叆 %d 鏉★紝璺宠繃宸插瓨鍦ㄦ暟鎹� %d 鏉�", waitToSaveList.size(), skipCount));
             }
         } catch (Exception e) {
             log.error("瀵煎叆浜у搧瑙勬牸寮傚父", e);
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 6adaf2a..98b3f23 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java
+++ b/src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.basic.dto.SupplierManageDto;
@@ -12,6 +13,8 @@
 import com.ruoyi.basic.service.ISupplierService;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.project.system.mapper.SysDictDataMapper;
 import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
 import com.ruoyi.purchase.pojo.PurchaseLedger;
 import jakarta.servlet.http.HttpServletResponse;
@@ -30,6 +33,7 @@
 
     private final SupplierManageMapper supplierMapper;
     private final PurchaseLedgerMapper purchaseLedgerMapper;
+    private final SysDictDataMapper sysDictDataMapper;
 
     /**
      * 渚涘簲鍟嗘柊澧�
@@ -107,13 +111,22 @@
     }
 
     @Override
-    public Boolean importData(MultipartFile file) {
-
+    public R importData(MultipartFile file) {
         try {
             ExcelUtil<SupplierManageExcelDto> util = new ExcelUtil<SupplierManageExcelDto>(SupplierManageExcelDto.class);
             List<SupplierManageExcelDto> list = util.importExcel(file.getInputStream());
+
+            if (CollectionUtils.isEmpty(list)) {
+                return R.fail("妯℃澘閿欒鎴栧鍏ユ暟鎹负绌�");
+            }
+
             ArrayList<SupplierManage> supplierManages = new ArrayList<>();
             list.stream().forEach(dto -> {
+                // 渚涘簲鍟嗙被鍨嬫槸鍚﹀瓨鍦� 锛堢敳涔欎笝涓侊級
+                String supplierType = dto.getSupplierType();
+                if (!supplierType.equals("鐢�") && !supplierType.equals("涔�") && !supplierType.equals("涓�") && !supplierType.equals("涓�")) {
+                    throw new RuntimeException("渚涘簲鍟嗙被鍨� " + supplierType + " 涓嶅瓨鍦紒");
+                }
                 SupplierManage supplierManage = new SupplierManage();
                 BeanUtils.copyProperties(dto,supplierManage);
                 supplierManage.setMaintainTime(LocalDate.now());
@@ -124,10 +137,10 @@
             });
 
             this.saveOrUpdateBatch(supplierManages);
-            return true;
+            return R.ok("瀵煎叆鎴愬姛");
         }catch (Exception e){
             e.printStackTrace();
+            return R.fail(e.getMessage());
         }
-        return false;
     }
 }
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/controller/DutyPlanController.java b/src/main/java/com/ruoyi/collaborativeApproval/controller/DutyPlanController.java
index d622e99..8be45b5 100644
--- a/src/main/java/com/ruoyi/collaborativeApproval/controller/DutyPlanController.java
+++ b/src/main/java/com/ruoyi/collaborativeApproval/controller/DutyPlanController.java
@@ -7,7 +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.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.AllArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -20,39 +21,39 @@
 @RestController
 @RequestMapping("/dutyPlan")
 @AllArgsConstructor
-public class DutyPlanController {
+public class DutyPlanController extends BaseController {
     private DutyPlanService dutyPlanService;
 
     @GetMapping("/getList")
     @Operation(summary = "鍒嗛〉鏌ヨ")
-    public AjaxResult listPage(Page page, DutyPlanDTO dutyPlanDTO){
-        return AjaxResult.success(dutyPlanService.listPage(page, dutyPlanDTO));
+    public R<?> listPage(Page page, DutyPlanDTO dutyPlanDTO){
+        return R.ok(dutyPlanService.listPage(page, dutyPlanDTO));
     }
     @GetMapping("/getNum")
     @Operation(summary = "鑾峰彇绛夌骇鏁版嵁")
-    public AjaxResult getNum(){
-        return AjaxResult.success(dutyPlanService.getNum());
+    public R<?> getNum(){
+        return R.ok(dutyPlanService.getNum());
     }
 
     @PostMapping("/add")
     @Operation(summary = "鏂板")
-    public AjaxResult add(@RequestBody DutyPlan dutyPlan){
-        return AjaxResult.success(dutyPlanService.save(dutyPlan));
+    public R<?> add(@RequestBody DutyPlan dutyPlan){
+        return R.ok(dutyPlanService.save(dutyPlan));
     }
 
     @PostMapping("/update")
     @Operation(summary = "淇敼")
-    public AjaxResult update(@RequestBody DutyPlan dutyPlan){
-        return AjaxResult.success(dutyPlanService.updateById(dutyPlan));
+    public R<?> update(@RequestBody DutyPlan dutyPlan){
+        return R.ok(dutyPlanService.updateById(dutyPlan));
     }
 
     @DeleteMapping("/delete")
     @Operation(summary = "鍒犻櫎")
-    public AjaxResult delete(@RequestBody List<Long> ids){
+    public R<?> delete(@RequestBody List<Long> ids){
         if (CollectionUtils.isEmpty(ids)) {
             throw new RuntimeException("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
         }
-        return AjaxResult.success(dutyPlanService.removeBatchByIds(ids));
+        return R.ok(dutyPlanService.removeBatchByIds(ids));
     }
     @PostMapping("/export")
     @Operation(summary = "瀵煎嚭")
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/controller/NoticeController.java b/src/main/java/com/ruoyi/collaborativeApproval/controller/NoticeController.java
index ba1df00..e3ef9b6 100644
--- a/src/main/java/com/ruoyi/collaborativeApproval/controller/NoticeController.java
+++ b/src/main/java/com/ruoyi/collaborativeApproval/controller/NoticeController.java
@@ -9,7 +9,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.project.system.service.ISysNoticeService;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
@@ -32,27 +32,27 @@
     @GetMapping("/page")
     @Log(title = "鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
     @Operation(summary = "鍒嗛〉鏌ヨ")
-    public AjaxResult listPage(Page page, NoticeDTO noticeDTO){
-        return AjaxResult.success(noticeService.listPage(page, noticeDTO));
+    public R<?> listPage(Page page, NoticeDTO noticeDTO){
+        return R.ok(noticeService.listPage(page, noticeDTO));
     }
 
     @PostMapping("/add")
     @Log(title = "鏂板", businessType = BusinessType.INSERT)
     @Operation(summary = "鏂板")
-    public AjaxResult add(@RequestBody NoticeDTO noticeDTO){
+    public R<?> add(@RequestBody NoticeDTO noticeDTO){
         if (noticeDTO.getStatus()==1){
             //姝e紡鍙戝竷閫氱煡鎵�鏈変汉鐨勬秷鎭�氱煡
             sysNoticeService.simpleNoticeAll("閫氱煡鍏憡",
                     noticeDTO.getTitle(),
                     "/collaborativeApproval/noticeManagement?type="+noticeDTO.getType());
         }
-        return AjaxResult.success(noticeService.save(noticeDTO));
+        return R.ok(noticeService.save(noticeDTO));
     }
 
     @PutMapping("/update")
     @Log(title = "淇敼", businessType = BusinessType.UPDATE)
     @Operation(summary = "淇敼")
-    public AjaxResult update(@RequestBody NoticeDTO noticeDTO){
+    public R<?> update(@RequestBody NoticeDTO noticeDTO){
         if (ObjectUtils.isNotNull(noticeDTO.getStatus()) && noticeDTO.getStatus()==1){
             Notice notice = noticeService.getById(noticeDTO.getId());
             //姝e紡鍙戝竷閫氱煡鎵�鏈変汉鐨勬秷鎭�氱煡
@@ -60,23 +60,23 @@
                     notice.getTitle(),
                     "/collaborativeApproval/noticeManagement?type="+notice.getType());
         }
-        return AjaxResult.success(noticeService.updateById(noticeDTO));
+        return R.ok(noticeService.updateById(noticeDTO));
     }
 
     @DeleteMapping("/{ids}")
     @Log(title = "鍒犻櫎", businessType = BusinessType.DELETE)
     @Operation(summary = "鍒犻櫎")
-    public AjaxResult delete(@PathVariable("ids") List<Long> ids){
+    public R<?> delete(@PathVariable("ids") List<Long> ids){
         if (CollectionUtils.isEmpty(ids)) {
             throw new RuntimeException("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
         }
-        return AjaxResult.success(noticeService.removeBatchByIds(ids));
+        return R.ok(noticeService.removeBatchByIds(ids));
     }
 
     @GetMapping("/count")
     @Log(title = "鑾峰彇鍏憡鏁伴噺", businessType = BusinessType.OTHER)
     @Operation(summary = "鑾峰彇鍏憡鏁伴噺")
-    public AjaxResult count(){
-        return AjaxResult.success(noticeService.selectCount());
+    public R<?> count(){
+        return R.ok(noticeService.selectCount());
     }
 }
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/controller/NoticeTypeController.java b/src/main/java/com/ruoyi/collaborativeApproval/controller/NoticeTypeController.java
index dba3e77..e90d5d1 100644
--- a/src/main/java/com/ruoyi/collaborativeApproval/controller/NoticeTypeController.java
+++ b/src/main/java/com/ruoyi/collaborativeApproval/controller/NoticeTypeController.java
@@ -5,7 +5,8 @@
 import com.ruoyi.basic.pojo.SupplierManage;
 import com.ruoyi.collaborativeApproval.pojo.NoticeType;
 import com.ruoyi.collaborativeApproval.service.NoticeTypeService;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import lombok.AllArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
@@ -24,7 +25,7 @@
 @RestController
 @RequestMapping("/noticeType")
 @AllArgsConstructor
-public class NoticeTypeController {
+public class NoticeTypeController extends BaseController {
 
     private NoticeTypeService noticeTypeService;
 
@@ -34,8 +35,8 @@
      * @return
      */
     @PostMapping("/add")
-    public AjaxResult add(@RequestBody NoticeType noticeType) {
-        return AjaxResult.success(noticeTypeService.saveOrUpdate(noticeType));
+    public R<?> add(@RequestBody NoticeType noticeType) {
+        return R.ok(noticeTypeService.saveOrUpdate(noticeType));
     }
 
     /**
@@ -44,11 +45,11 @@
      * @return
      */
     @DeleteMapping("/del")
-    public AjaxResult delNoticeType(@RequestBody List<Integer> ids) {
+    public R<?> delNoticeType(@RequestBody List<Integer> ids) {
         if(CollectionUtils.isEmpty(ids)){
-            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+            return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         }
-        return AjaxResult.success(noticeTypeService.removeBatchByIds(ids));
+        return R.ok(noticeTypeService.removeBatchByIds(ids));
     }
 
     /**
@@ -56,8 +57,8 @@
      * @return
      */
     @GetMapping("/list")
-    public AjaxResult noticeTypeList() {
-        return AjaxResult.success(noticeTypeService.list());
+    public R<?> noticeTypeList() {
+        return R.ok(noticeTypeService.list());
     }
 
 }
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementController.java b/src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementController.java
index 5e59117..2496515 100644
--- a/src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementController.java
+++ b/src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementController.java
@@ -8,7 +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.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.AllArgsConstructor;
@@ -23,57 +24,57 @@
 @RequestMapping("/rulesRegulationsManagement")
 @AllArgsConstructor
 @Tag(name = "鍒跺害绠$悊")
-public class RulesRegulationsManagementController {
+public class RulesRegulationsManagementController extends BaseController {
     private RulesRegulationsManagementService rulesRegulationsManagementService;
     private ReadingStatusMapper readingStatusMapper;
 
     @GetMapping("/getList")
     @Operation(summary = "鍒嗛〉鏌ヨ")
-    public AjaxResult listPage(Page page, RulesRegulationsManagement rulesRegulationsManagement){
-        return AjaxResult.success(rulesRegulationsManagementService.listPage(page, rulesRegulationsManagement));
+    public R<?> listPage(Page page, RulesRegulationsManagement rulesRegulationsManagement){
+        return R.ok(rulesRegulationsManagementService.listPage(page, rulesRegulationsManagement));
     }
 
     @PostMapping("/add")
     @Operation(summary = "鏂板")
-    public AjaxResult add(@RequestBody RulesRegulationsManagement rulesRegulationsManagement){
+    public R<?> add(@RequestBody RulesRegulationsManagement rulesRegulationsManagement){
         rulesRegulationsManagementService.save(rulesRegulationsManagement);
-        return AjaxResult.success(rulesRegulationsManagement.getId());
+        return R.ok(rulesRegulationsManagement.getId());
     }
 
     @PostMapping("/update")
     @Operation(summary = "淇敼")
-    public AjaxResult update(@RequestBody RulesRegulationsManagement rulesRegulationsManagement){
-        return AjaxResult.success(rulesRegulationsManagementService.updateById(rulesRegulationsManagement));
+    public R<?> update(@RequestBody RulesRegulationsManagement rulesRegulationsManagement){
+        return R.ok(rulesRegulationsManagementService.updateById(rulesRegulationsManagement));
     }
 
     @DeleteMapping("/delete")
     @Operation(summary = "鍒犻櫎")
-    public AjaxResult delete(@PathVariable("ids") List<Long> ids){
+    public R<?> delete(@PathVariable("ids") List<Long> ids){
         if (CollectionUtils.isEmpty(ids)) {
             throw new RuntimeException("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
         }
-        return AjaxResult.success(rulesRegulationsManagementService.removeBatchByIds(ids));
+        return R.ok(rulesRegulationsManagementService.removeBatchByIds(ids));
     }
     //瑙勫垯鏌ョ湅鏃舵柊澧為槄璇荤姸鎬�
     @PostMapping("/addReadingStatus")
     @Operation(summary = "鏂板闃呰鐘舵��")
-    public AjaxResult addReadingStatus(@RequestBody ReadingStatus readingStatus){
-        return AjaxResult.success(readingStatusMapper.insert(readingStatus));
+    public R<?> addReadingStatus(@RequestBody ReadingStatus readingStatus){
+        return R.ok(readingStatusMapper.insert(readingStatus));
     }
     @PostMapping("/updateReadingStatus")
     @Operation(summary = "淇敼闃呰鐘舵��")
-    public AjaxResult updateReadingStatus(@RequestBody ReadingStatus readingStatus){
-        return AjaxResult.success(readingStatusMapper.updateById(readingStatus));
+    public R<?> updateReadingStatus(@RequestBody ReadingStatus readingStatus){
+        return R.ok(readingStatusMapper.updateById(readingStatus));
     }
     @GetMapping("/getReadingStatusList")
     @Operation(summary = "鍒嗛〉鏌ヨ闃呰鐘舵��")
-    public AjaxResult listPage(Page page, ReadingStatus readingStatus){
-        return AjaxResult.success(readingStatusMapper.selectPage(page,new QueryWrapper<ReadingStatus>(readingStatus)));
+    public R<?> listPage(Page page, ReadingStatus readingStatus){
+        return R.ok(readingStatusMapper.selectPage(page,new QueryWrapper<ReadingStatus>(readingStatus)));
     }
     @GetMapping("/getReadingStatusByRuleId/{ruleId}")
     @Operation(summary = "鏍规嵁鍒跺害id鏌ヨ闃呰鐘舵��")
-    public AjaxResult getReadingStatusByRuleId(@PathVariable Long ruleId){
-        return AjaxResult.success(readingStatusMapper.selectList(new QueryWrapper<ReadingStatus>().eq("rule_id", ruleId)));
+    public R<?> getReadingStatusByRuleId(@PathVariable Long ruleId){
+        return R.ok(readingStatusMapper.selectList(new QueryWrapper<ReadingStatus>().eq("rule_id", ruleId)));
     }
 
     @Operation(summary = "瑙勭珷鍒跺害绠$悊瀵煎嚭")
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementFileController.java b/src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementFileController.java
index 3f770f8..4d77ff7 100644
--- a/src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementFileController.java
+++ b/src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementFileController.java
@@ -3,7 +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.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.quality.pojo.QualityInspectFile;
 import com.ruoyi.quality.service.IQualityInspectFileService;
 import org.springframework.util.CollectionUtils;
@@ -22,7 +23,7 @@
  */
 @RestController
 @RequestMapping("/rulesRegulationsManagementFile")
-public class RulesRegulationsManagementFileController {
+public class RulesRegulationsManagementFileController extends BaseController {
 
     @Resource
     private RulesRegulationsManagementFileService rulesRegulationsManagementFileService;
@@ -34,8 +35,8 @@
      * @return
      */
     @PostMapping("/add")
-    public AjaxResult add(@RequestBody RulesRegulationsManagementFile rulesRegulationsManagementFile) {
-        return AjaxResult.success(rulesRegulationsManagementFileService.save(rulesRegulationsManagementFile));
+    public R<?> add(@RequestBody RulesRegulationsManagementFile rulesRegulationsManagementFile) {
+        return R.ok(rulesRegulationsManagementFileService.save(rulesRegulationsManagementFile));
     }
 
     /**
@@ -44,12 +45,12 @@
      * @return
      */
     @DeleteMapping("/del")
-    public AjaxResult delQualityUnqualified(@RequestBody List<Integer> ids) {
+    public R<?> delQualityUnqualified(@RequestBody List<Integer> ids) {
         if(CollectionUtils.isEmpty(ids)){
-            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+            return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         }
         //鍒犻櫎妫�楠岄檮浠�
-        return AjaxResult.success(rulesRegulationsManagementFileService.removeBatchByIds(ids));
+        return R.ok(rulesRegulationsManagementFileService.removeBatchByIds(ids));
     }
 
     /**
@@ -59,8 +60,8 @@
      * @return
      */
     @GetMapping("/listPage")
-    public AjaxResult listPage(Page page, RulesRegulationsManagementFile rulesRegulationsManagementFile) {
-        return AjaxResult.success(rulesRegulationsManagementFileService.listPage(page, rulesRegulationsManagementFile));
+    public R<?> listPage(Page page, RulesRegulationsManagementFile rulesRegulationsManagementFile) {
+        return R.ok(rulesRegulationsManagementFileService.listPage(page, rulesRegulationsManagementFile));
     }
 
 }
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/controller/SealApplicationManagementController.java b/src/main/java/com/ruoyi/collaborativeApproval/controller/SealApplicationManagementController.java
index dc6a64e..e9e411f 100644
--- a/src/main/java/com/ruoyi/collaborativeApproval/controller/SealApplicationManagementController.java
+++ b/src/main/java/com/ruoyi/collaborativeApproval/controller/SealApplicationManagementController.java
@@ -11,7 +11,8 @@
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.project.system.service.ISysNoticeService;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
@@ -28,20 +29,20 @@
 @RestController
 @RequestMapping("/sealApplicationManagement")
 @Tag(name = "鐢ㄥ嵃鐢宠绠$悊")
-public class SealApplicationManagementController {
+public class SealApplicationManagementController extends BaseController {
     private SealApplicationManagementService sealApplicationManagementService;
     private ISysNoticeService sysNoticeService;
     private FileUtil fileUtil;
 
     @GetMapping("/getList")
     @Operation(summary = "鍒嗛〉鏌ヨ")
-    public AjaxResult listPage(Page page, SealApplicationManagement sealApplicationManagement){
-        return AjaxResult.success(sealApplicationManagementService.listPage(page,sealApplicationManagement));
+    public R<?> listPage(Page page, SealApplicationManagement sealApplicationManagement){
+        return R.ok(sealApplicationManagementService.listPage(page,sealApplicationManagement));
     }
 
     @PostMapping("/add")
     @Operation(summary = "鏂板")
-    public AjaxResult add(@RequestBody SealApplicationManagementDTO sealApplicationManagement){
+    public R<?> add(@RequestBody SealApplicationManagementDTO sealApplicationManagement){
         sealApplicationManagementService.save(sealApplicationManagement);
         // 5. 淇濆瓨閿�鍞彴璐﹂檮浠�
         fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE,
@@ -54,30 +55,30 @@
                 +"鐢宠鏍囬锛�"+sealApplicationManagement.getTitle(),
                 Arrays.asList(sealApplicationManagement.getApproveUserId()),
                 "/collaborativeApproval/sealManagement?applicationNum="+sealApplicationManagement.getApplicationNum());
-        return AjaxResult.success();
+        return R.ok();
     }
 
     @PostMapping("/update")
     @Operation(summary = "淇敼")
-    public AjaxResult update(@RequestBody SealApplicationManagementDTO sealApplicationManagement){
+    public R<?> update(@RequestBody SealApplicationManagementDTO sealApplicationManagement){
         // 5. 淇濆瓨閿�鍞彴璐﹂檮浠�
         fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE,
                 RecordTypeEnum.SEAL_APPLICATION_MANAGEMENT,
                 sealApplicationManagement.getId(),
                 sealApplicationManagement.getStorageBlobDTOs());
-        return AjaxResult.success(sealApplicationManagementService.updateById(sealApplicationManagement));
+        return R.ok(sealApplicationManagementService.updateById(sealApplicationManagement));
     }
 
     @DeleteMapping("/delete")
     @Operation(summary = "鍒犻櫎")
-    public AjaxResult delete(@PathVariable("ids") List<Long> ids){
+    public R<?> delete(@PathVariable("ids") List<Long> ids){
         if (CollectionUtils.isEmpty(ids)) {
             throw new RuntimeException("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
         }
         fileUtil.deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordIds(ApplicationTypeEnum.FILE,
                 RecordTypeEnum.SEAL_APPLICATION_MANAGEMENT,
                 ids);
-        return AjaxResult.success(sealApplicationManagementService.removeBatchByIds(ids));
+        return R.ok(sealApplicationManagementService.removeBatchByIds(ids));
     }
 
     @Operation(summary = "鐢ㄥ嵃鐢宠绠$悊瀵煎嚭")
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/controller/StaffContactsPersonalController.java b/src/main/java/com/ruoyi/collaborativeApproval/controller/StaffContactsPersonalController.java
index 3673208..fa72a40 100644
--- a/src/main/java/com/ruoyi/collaborativeApproval/controller/StaffContactsPersonalController.java
+++ b/src/main/java/com/ruoyi/collaborativeApproval/controller/StaffContactsPersonalController.java
@@ -4,7 +4,8 @@
 import com.ruoyi.collaborativeApproval.dto.StaffContactsPersonalDTO;
 import com.ruoyi.collaborativeApproval.pojo.StaffContactsPersonal;
 import com.ruoyi.collaborativeApproval.service.StaffContactsPersonalService;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.AllArgsConstructor;
 import org.springframework.web.bind.annotation.*;
@@ -12,27 +13,27 @@
 @RestController
 @RequestMapping("/staffContactsPersonal")
 @AllArgsConstructor
-public class StaffContactsPersonalController {
+public class StaffContactsPersonalController extends BaseController {
     private StaffContactsPersonalService staffContactsPersonalService;
 
     @GetMapping("/getList")
     @Operation(summary = "鍒嗛〉鏌ヨ")
-    public AjaxResult listPage(Page page, StaffContactsPersonalDTO staffContactsPersonalDTO) {
-        return AjaxResult.success(staffContactsPersonalService.listPage(page, staffContactsPersonalDTO));
+    public R<?> listPage(Page page, StaffContactsPersonalDTO staffContactsPersonalDTO) {
+        return R.ok(staffContactsPersonalService.listPage(page, staffContactsPersonalDTO));
     }
 
     @PostMapping("/add")
     @Operation(summary = "鏂板")
-    public AjaxResult add(@RequestBody StaffContactsPersonal staffContactsPersonal) {
-        return AjaxResult.success(staffContactsPersonalService.save(staffContactsPersonal));
+    public R<?> add(@RequestBody StaffContactsPersonal staffContactsPersonal) {
+        return R.ok(staffContactsPersonalService.save(staffContactsPersonal));
     }
 
     @DeleteMapping("/delete/{id}")
     @Operation(summary = "鍒犻櫎")
-    public AjaxResult delete(@PathVariable("id") Long id) {
+    public R<?> delete(@PathVariable("id") Long id) {
 //        if (CollectionUtils.isEmpty(id)) {
 //            throw new RuntimeException("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
 //        }
-        return AjaxResult.success(staffContactsPersonalService.removeById(id));
+        return R.ok(staffContactsPersonalService.removeById(id));
     }
 }
diff --git a/src/main/java/com/ruoyi/compensationperformance/controller/CompensationPerformanceController.java b/src/main/java/com/ruoyi/compensationperformance/controller/CompensationPerformanceController.java
index 25f91c5..ecde7dd 100644
--- a/src/main/java/com/ruoyi/compensationperformance/controller/CompensationPerformanceController.java
+++ b/src/main/java/com/ruoyi/compensationperformance/controller/CompensationPerformanceController.java
@@ -8,7 +8,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.staff.mapper.StaffOnJobMapper;
 import com.ruoyi.staff.pojo.StaffOnJob;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -40,37 +40,37 @@
     @GetMapping("/listPage")
     @Log(title = "钖叕缁╂晥-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
     @Operation(summary = "钖叕缁╂晥-鍒嗛〉鏌ヨ")
-    public AjaxResult listPage(Page page, String staffName, String payDateStr) {
+    public R<?> listPage(Page page, String staffName, String payDateStr) {
         IPage<CompensationPerformance> listPage = compensationPerformanceService.listPage(page, staffName, payDateStr);
-        return AjaxResult.success(listPage);
+        return R.ok(listPage);
     }
 
     @PostMapping("/add")
     @Log(title = "钖叕缁╂晥-娣诲姞", businessType = BusinessType.INSERT)
     @Operation(summary = "钖叕缁╂晥-娣诲姞")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult add(@RequestBody CompensationPerformance compensationPerformance) {
+    public R<?> add(@RequestBody CompensationPerformance compensationPerformance) {
         boolean save = compensationPerformanceService.save(compensationPerformance);
-        return save ? AjaxResult.success("娣诲姞鎴愬姛") : AjaxResult.error("娣诲姞澶辫触");
+        return save ? R.ok(null, "娣诲姞鎴愬姛") : R.fail("娣诲姞澶辫触");
     }
 
     @PostMapping("/update")
     @Log(title = "钖叕缁╂晥-淇敼", businessType = BusinessType.UPDATE)
     @Operation(summary = "钖叕缁╂晥-淇敼")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult update(@RequestBody CompensationPerformance compensationPerformance) {
+    public R<?> update(@RequestBody CompensationPerformance compensationPerformance) {
         boolean update = compensationPerformanceService.updateById(compensationPerformance);
-        return update ? AjaxResult.success("淇敼鎴愬姛") : AjaxResult.error("淇敼澶辫触");
+        return update ? R.ok(null, "淇敼鎴愬姛") : R.fail("淇敼澶辫触");
     }
 
     @DeleteMapping("/delete")
     @Log(title = "钖叕缁╂晥-鍒犻櫎", businessType = BusinessType.DELETE)
     @Operation(summary = "钖叕缁╂晥-鍒犻櫎")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult delete(@RequestBody List<Long> ids) {
-        if (CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+    public R<?> delete(@RequestBody List<Long> ids) {
+        if (CollectionUtils.isEmpty(ids)) return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
         boolean delete = compensationPerformanceService.removeBatchByIds(ids);
-        return delete ? AjaxResult.success("鍒犻櫎鎴愬姛") : AjaxResult.error("鍒犻櫎澶辫触");
+        return delete ? R.ok(null, "鍒犻櫎鎴愬姛") : R.fail("鍒犻櫎澶辫触");
     }
 
     @Log(title = "瀵煎嚭钖祫绠$悊鍒楄〃", businessType = BusinessType.EXPORT)
@@ -91,7 +91,7 @@
 
     @Log(title = "瀵煎叆钖祫绠$悊鍒楄〃", businessType = BusinessType.IMPORT)
     @PostMapping("/importData")
-    public AjaxResult importData(MultipartFile file) throws Exception {
+    public R<?> importData(MultipartFile file) throws Exception {
         ExcelUtil<CompensationPerformance> util = new ExcelUtil<>(CompensationPerformance.class);
         List<CompensationPerformance> list = util.importExcel(file.getInputStream());
         list.forEach(item -> {
@@ -101,7 +101,7 @@
             }
         });
         boolean b = compensationPerformanceService.saveBatch(list);
-        return AjaxResult.success(b);
+        return R.ok(b);
     }
 
 
diff --git a/src/main/java/com/ruoyi/customervisits/controller/CustomerVisitsController.java b/src/main/java/com/ruoyi/customervisits/controller/CustomerVisitsController.java
index 586ee42..5efdf5a 100644
--- a/src/main/java/com/ruoyi/customervisits/controller/CustomerVisitsController.java
+++ b/src/main/java/com/ruoyi/customervisits/controller/CustomerVisitsController.java
@@ -8,7 +8,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.AllArgsConstructor;
@@ -31,46 +31,46 @@
     @GetMapping("/listPage")
     @Log(title = "瀹㈡埛鎷滆-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
     @Operation(summary = "瀹㈡埛鎷滆-鍒嗛〉鏌ヨ")
-    public AjaxResult listPage(Page page, CustomerVisits customerVisits) {
+    public R<?> listPage(Page page, CustomerVisits customerVisits) {
         IPage<CustomerVisits> listPage = customerVisitsService.listPage(page, customerVisits);
-        return AjaxResult.success(listPage);
+        return R.ok(listPage);
     }
 
     @Log(title = "瀹㈡埛鎷滆-娣诲姞", businessType = BusinessType.INSERT)
     @Operation(summary = "瀹㈡埛鎷滆-娣诲姞")
     @PostMapping("/add")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult add(@RequestBody CustomerVisits customerVisits) {
+    public R<?> add(@RequestBody CustomerVisits customerVisits) {
         boolean save = customerVisitsService.save(customerVisits);
         if (save) {
-            return AjaxResult.success("娣诲姞鎴愬姛");
+            return R.ok(null, "娣诲姞鎴愬姛");
         }
-        return AjaxResult.error("娣诲姞澶辫触");
+        return R.fail("娣诲姞澶辫触");
     }
 
     @Log(title = "瀹㈡埛鎷滆-缂栬緫", businessType = BusinessType.UPDATE)
     @Operation(summary = "瀹㈡埛鎷滆-缂栬緫")
     @PostMapping("update")
-    public AjaxResult updateCustomerVisit(@RequestBody CustomerVisits customerVisits) {
+    public R<?> updateCustomerVisit(@RequestBody CustomerVisits customerVisits) {
         boolean updateResult = customerVisitsService.updateCustomerVisit(customerVisits);
         if (updateResult) {
-            return AjaxResult.success("缂栬緫鎴愬姛");
+            return R.ok(null, "缂栬緫鎴愬姛");
         }
-        return AjaxResult.error("缂栬緫澶辫触");
+        return R.fail("缂栬緫澶辫触");
     }
 
     @Log(title = "瀹㈡埛鎷滆-鍒犻櫎", businessType = BusinessType.DELETE)
     @Operation(summary = "瀹㈡埛鎷滆-鍒犻櫎")
     @DeleteMapping("{customerId}")
-    public AjaxResult deleteCustomerVisit(@PathVariable Integer customerId) {
+    public R<?> deleteCustomerVisit(@PathVariable Integer customerId) {
         if (customerId == null) {
-            return AjaxResult.error("瀹㈡埛ID涓嶈兘涓虹┖");
+            return R.fail("瀹㈡埛ID涓嶈兘涓虹┖");
         }
         boolean deleteResult = customerVisitsService.removeById(customerId);
         if (deleteResult) {
-            return AjaxResult.success("鍒犻櫎鎴愬姛");
+            return R.ok(null, "鍒犻櫎鎴愬姛");
         }
-        return AjaxResult.error("鍒犻櫎澶辫触");
+        return R.fail("鍒犻櫎澶辫触");
     }
 
 }
diff --git a/src/main/java/com/ruoyi/customervisits/service/CustomerVisitsService.java b/src/main/java/com/ruoyi/customervisits/service/CustomerVisitsService.java
index 1f8d1ef..0cd35cf 100644
--- a/src/main/java/com/ruoyi/customervisits/service/CustomerVisitsService.java
+++ b/src/main/java/com/ruoyi/customervisits/service/CustomerVisitsService.java
@@ -4,7 +4,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.customervisits.pojo.CustomerVisits;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 
 /**
  * @author :yys
diff --git a/src/main/java/com/ruoyi/device/controller/DeviceDefectRecordController.java b/src/main/java/com/ruoyi/device/controller/DeviceDefectRecordController.java
index 1fd1c04..ba8de8b 100644
--- a/src/main/java/com/ruoyi/device/controller/DeviceDefectRecordController.java
+++ b/src/main/java/com/ruoyi/device/controller/DeviceDefectRecordController.java
@@ -4,7 +4,8 @@
 import com.ruoyi.device.dto.DeviceDefectRecordDto;
 import com.ruoyi.device.pojo.DeviceDefectRecord;
 import com.ruoyi.device.service.DeviceDefectRecordService;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.AllArgsConstructor;
@@ -14,35 +15,35 @@
 @RequestMapping("/defect")
 @AllArgsConstructor
 @RestController
-public class DeviceDefectRecordController {
+public class DeviceDefectRecordController extends BaseController {
     private DeviceDefectRecordService deviceDefectRecordService;
     @Operation(summary = "璁惧缂洪櫡璁板綍鍒楄〃")
     @GetMapping("/page")
-    public AjaxResult page(Page page , DeviceDefectRecordDto deviceDefectRecordDto) {
-        return AjaxResult.success(deviceDefectRecordService.listPage(page,deviceDefectRecordDto));
+    public R<?> page(Page page , DeviceDefectRecordDto deviceDefectRecordDto) {
+        return R.ok(deviceDefectRecordService.listPage(page,deviceDefectRecordDto));
     }
     @Operation(summary = "璁惧id鏌ヨ璁惧缂洪櫡璁板綍鍒楄〃")
     @GetMapping("/find/{deviceLedgerId}")
-    public AjaxResult find(@PathVariable Long deviceLedgerId) {
+    public R<?> find(@PathVariable Long deviceLedgerId) {
         DeviceDefectRecordDto deviceDefectRecordDto = new DeviceDefectRecordDto();
         deviceDefectRecordDto.setDeviceLedgerId(deviceLedgerId);
-        return AjaxResult.success(deviceDefectRecordService.listPage(new Page<>(1,-1),deviceDefectRecordDto));
+        return R.ok(deviceDefectRecordService.listPage(new Page<>(1,-1),deviceDefectRecordDto));
     }
 
     @PostMapping("/add")
     @Operation(summary = "娣诲姞璁惧缂洪櫡璁板綍")
-    public AjaxResult add(@RequestBody DeviceDefectRecord deviceDefectRecord) {
-        return AjaxResult.success(deviceDefectRecordService.add(deviceDefectRecord));
+    public R<?> add(@RequestBody DeviceDefectRecord deviceDefectRecord) {
+        return R.ok(deviceDefectRecordService.add(deviceDefectRecord));
     }
     @PostMapping("/update")
     @Operation(summary = "淇敼璁惧缂洪櫡璁板綍")
-    public AjaxResult update(@RequestBody DeviceDefectRecord deviceDefectRecord) {
-        return AjaxResult.success(deviceDefectRecordService.updateByDDR(deviceDefectRecord));
+    public R<?> update(@RequestBody DeviceDefectRecord deviceDefectRecord) {
+        return R.ok(deviceDefectRecordService.updateByDDR(deviceDefectRecord));
     }
     @DeleteMapping("/delete")
     @Operation(summary = "鍒犻櫎璁惧缂洪櫡璁板綍")
-    public AjaxResult delete(@PathVariable Long id) {
-        return AjaxResult.success(deviceDefectRecordService.removeById(id));
+    public R<?> delete(@PathVariable Long id) {
+        return R.ok(deviceDefectRecordService.removeById(id));
     }
 
 }
diff --git a/src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java b/src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java
index f4b807d..40c6dad 100644
--- a/src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java
+++ b/src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java
@@ -12,7 +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.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import jakarta.servlet.http.HttpServletResponse;
@@ -28,7 +29,7 @@
 @RequestMapping("/device/ledger")
 @RestController
 @AllArgsConstructor
-public class DeviceLedgerController {
+public class DeviceLedgerController extends BaseController {
 
     private IDeviceLedgerService deviceLedgerService;
     private DeviceLedgerMapper deviceLedgerMapper;
@@ -38,37 +39,37 @@
 
     @Operation(summary = "璁惧鍙拌处鍒楄〃")
     @GetMapping("/page")
-    public AjaxResult page(Page page , DeviceLedgerDto deviceLedger) {
-        return AjaxResult.success(deviceLedgerService.queryPage(page,deviceLedger));
+    public R<?> page(Page page , DeviceLedgerDto deviceLedger) {
+        return R.ok(deviceLedgerService.queryPage(page,deviceLedger));
     }
 
     @PostMapping()
     @Operation(summary = "娣诲姞璁惧鍙拌处")
-    public AjaxResult add(@RequestBody DeviceLedger deviceLedger) {
+    public R<?> add(@RequestBody DeviceLedger deviceLedger) {
 
         return deviceLedgerService.saveDeviceLedger(deviceLedger);
     }
 
     @Operation(summary = "鏍规嵁id鏌ヨ璁惧鍙拌处")
     @GetMapping("/{id}")
-    public AjaxResult detail(@PathVariable Long id) {
-        return AjaxResult.success(deviceLedgerService.getById(id));
+    public R<?> detail(@PathVariable Long id) {
+        return R.ok(deviceLedgerService.getById(id));
     }
 
     @PutMapping ()
     @Operation(summary = "淇敼璁惧鍙拌处")
-    public AjaxResult update(@RequestBody DeviceLedger deviceLedger) {
+    public R<?> update(@RequestBody DeviceLedger deviceLedger) {
         return deviceLedgerService.updateDeviceLedger(deviceLedger);
     }
 
     @DeleteMapping("/{ids}")
     @Operation(summary = "鍒犻櫎璁惧鍙拌处")
-    public AjaxResult delete(@PathVariable("ids") ArrayList<Long> ids) {
+    public R<?> delete(@PathVariable("ids") ArrayList<Long> ids) {
         boolean b = deviceLedgerService.removeBatchByIds(ids);
         if (!b) {
-            return AjaxResult.error("鍒犻櫎澶辫触");
+            return R.fail("鍒犻櫎澶辫触");
         }
-        return AjaxResult.success();
+        return R.ok();
     }
 
     @PostMapping("export")
@@ -86,32 +87,32 @@
 
     @PostMapping("/import")
     @Operation(summary = "瀵煎叆璁惧鍙拌处")
-    public AjaxResult importData(MultipartFile file) throws IOException {
+    public R<?> importData(MultipartFile file) throws IOException {
         Boolean b = deviceLedgerService.importData(file);
         if (b) {
-            return AjaxResult.success("瀵煎叆鎴愬姛");
+            return R.ok(null, "瀵煎叆鎴愬姛");
         }
-        return AjaxResult.error("瀵煎叆澶辫触");
+        return R.fail("瀵煎叆澶辫触");
     }
 
 
     @GetMapping("getDeviceLedger")
     @Operation(summary = "鑾峰彇璁惧鍙拌处")
-    public AjaxResult getDeviceLedger( ) {
-        return AjaxResult.success(deviceLedgerService.list(new QueryWrapper<DeviceLedger>().lambda()
+    public R<?> getDeviceLedger( ) {
+        return R.ok(deviceLedgerService.list(new QueryWrapper<DeviceLedger>().lambda()
                 .select(DeviceLedger::getId, DeviceLedger::getDeviceName,DeviceLedger::getDeviceModel)));
     }
 
     @GetMapping("scanDevice")
     @Operation(summary = "鑾峰彇璁惧鍙拌处")
     @Anonymous
-    public AjaxResult scanDevice(Long id) {
+    public R<?> scanDevice(Long id) {
         List<DeviceMaintenance> list = deviceMaintenanceMapper.list1(id);
         DeviceLedger deviceLedger = deviceLedgerMapper.selectById1(id);
         if (list.size()>0){
             deviceLedger.setUpdateTime(list.get(0).getMaintenanceActuallyTime());//鏈�鍚庣淮鎶ゆ椂闂�
         }
         deviceLedger.setCreateTime(deviceLedger.getUpdateTime().plusMonths(1));//涓嬫缁存姢鏃堕棿
-        return AjaxResult.success(deviceLedger);
+        return R.ok(deviceLedger);
     }
 }
diff --git a/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java b/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java
index e34fc37..5442195 100644
--- a/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java
+++ b/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java
@@ -7,7 +7,8 @@
 import com.ruoyi.device.pojo.DeviceMaintenance;
 import com.ruoyi.device.service.IDeviceLedgerService;
 import com.ruoyi.device.service.IDeviceMaintenanceService;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import jakarta.servlet.http.HttpServletResponse;
@@ -20,7 +21,7 @@
 @RestController
 @RequestMapping("/device/maintenance")
 @AllArgsConstructor
-public class DeviceMaintenanceController {
+public class DeviceMaintenanceController extends BaseController {
 
 
     private IDeviceMaintenanceService deviceMaintenanceService;
@@ -28,13 +29,13 @@
 
     @Operation(summary = "璁惧淇濆吇鍒楄〃")
     @GetMapping("/page")
-    public AjaxResult page(Page page , DeviceMaintenanceDto deviceMaintenanceDto) {
-        return AjaxResult.success(deviceMaintenanceService.queryPage(page,deviceMaintenanceDto));
+    public R<?> page(Page page , DeviceMaintenanceDto deviceMaintenanceDto) {
+        return R.ok(deviceMaintenanceService.queryPage(page,deviceMaintenanceDto));
     }
 
     @PostMapping()
     @Operation(summary = "娣诲姞璁惧淇濆吇")
-    public AjaxResult add(@RequestBody DeviceMaintenanceDto deviceMaintenance) {
+    public R<?> add(@RequestBody DeviceMaintenanceDto deviceMaintenance) {
         DeviceLedger byId = deviceLedgerService.getById(deviceMaintenance.getDeviceLedgerId());
         deviceMaintenance.setDeviceName(byId.getDeviceName());
         deviceMaintenance.setDeviceModel(byId.getDeviceModel());
@@ -43,13 +44,13 @@
 
     @Operation(summary = "鏍规嵁id鏌ヨ璁惧淇濆吇")
     @GetMapping("/{id}")
-    public AjaxResult detail(@PathVariable Long id) {
-        return AjaxResult.success(deviceMaintenanceService.detailById(id));
+    public R<?> detail(@PathVariable Long id) {
+        return R.ok(deviceMaintenanceService.detailById(id));
     }
 
     @PutMapping ()
     @Operation(summary = "淇敼璁惧淇濆吇")
-    public AjaxResult update(@RequestBody DeviceMaintenanceDto deviceMaintenance) {
+    public R<?> update(@RequestBody DeviceMaintenanceDto deviceMaintenance) {
         DeviceLedger byId = deviceLedgerService.getById(deviceMaintenance.getDeviceLedgerId());
         deviceMaintenance.setDeviceName(byId.getDeviceName());
         deviceMaintenance.setDeviceModel(byId.getDeviceModel());
@@ -58,19 +59,19 @@
 
     @PostMapping ("maintenance")
     @Operation(summary = "淇敼璁惧淇濆吇")
-    public AjaxResult maintenance(@RequestBody DeviceMaintenanceDto deviceMaintenance) {
+    public R<?> maintenance(@RequestBody DeviceMaintenanceDto deviceMaintenance) {
         return deviceMaintenanceService.updateDeviceDeviceMaintenance(deviceMaintenance);
     }
 
 
     @DeleteMapping("/{ids}")
     @Operation(summary = "鍒犻櫎璁惧淇濆吇")
-    public AjaxResult delete(@PathVariable("ids") Long[] ids) {
+    public R<?> delete(@PathVariable("ids") Long[] ids) {
         boolean b = deviceMaintenanceService.removeBatchByIds(Arrays.asList(ids));
         if (!b) {
-            return AjaxResult.error("鍒犻櫎澶辫触");
+            return R.fail("鍒犻櫎澶辫触");
         }
-        return AjaxResult.success();
+        return R.ok();
     }
 
     @PostMapping("export")
diff --git a/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceFileController.java b/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceFileController.java
index d92d334..f4e1dd4 100644
--- a/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceFileController.java
+++ b/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceFileController.java
@@ -4,7 +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.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
@@ -23,7 +24,7 @@
 @RestController
 @RequestMapping("/maintenanceTaskFile")
 @Tag(name = "璁惧淇濆吇闄勪欢")
-public class DeviceMaintenanceFileController {
+public class DeviceMaintenanceFileController extends BaseController {
 
     @Resource
     private DeviceMaintenanceFileService deviceMaintenanceFileService;
@@ -35,8 +36,8 @@
      * @return
      */
     @PostMapping("/add")
-    public AjaxResult add(@RequestBody DeviceMaintenanceFile deviceMaintenanceFile) {
-        return AjaxResult.success(deviceMaintenanceFileService.save(deviceMaintenanceFile));
+    public R<?> add(@RequestBody DeviceMaintenanceFile deviceMaintenanceFile) {
+        return R.ok(deviceMaintenanceFileService.save(deviceMaintenanceFile));
     }
 
     /**
@@ -45,12 +46,12 @@
      * @return
      */
     @DeleteMapping("/del")
-    public AjaxResult delQualityUnqualified(@RequestBody List<Integer> ids) {
+    public R<?> delQualityUnqualified(@RequestBody List<Integer> ids) {
         if(CollectionUtils.isEmpty(ids)){
-            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+            return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         }
         //鍒犻櫎妫�楠岄檮浠�
-        return AjaxResult.success(deviceMaintenanceFileService.removeBatchByIds(ids));
+        return R.ok(deviceMaintenanceFileService.removeBatchByIds(ids));
     }
 
     /**
@@ -60,8 +61,8 @@
      * @return
      */
     @GetMapping("/listPage")
-    public AjaxResult qualityInspectFileListPage(Page page, DeviceMaintenanceFile deviceMaintenanceFile) {
-        return AjaxResult.success(deviceMaintenanceFileService.page(page, Wrappers.<DeviceMaintenanceFile>lambdaQuery().eq(DeviceMaintenanceFile::getDeviceMaintenanceId,deviceMaintenanceFile.getDeviceMaintenanceId())));
+    public R<?> qualityInspectFileListPage(Page page, DeviceMaintenanceFile deviceMaintenanceFile) {
+        return R.ok(deviceMaintenanceFileService.page(page, Wrappers.<DeviceMaintenanceFile>lambdaQuery().eq(DeviceMaintenanceFile::getDeviceMaintenanceId,deviceMaintenanceFile.getDeviceMaintenanceId())));
     }
 
 
diff --git a/src/main/java/com/ruoyi/device/controller/DeviceRepairController.java b/src/main/java/com/ruoyi/device/controller/DeviceRepairController.java
index 7df7c26..1b43372 100644
--- a/src/main/java/com/ruoyi/device/controller/DeviceRepairController.java
+++ b/src/main/java/com/ruoyi/device/controller/DeviceRepairController.java
@@ -5,7 +5,8 @@
 import com.ruoyi.device.dto.DeviceRepairDto;
 import com.ruoyi.device.pojo.DeviceRepair;
 import com.ruoyi.device.service.IDeviceRepairService;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import jakarta.servlet.http.HttpServletResponse;
@@ -18,54 +19,54 @@
 @RequestMapping("/device/repair")
 @RestController
 @AllArgsConstructor
-public class DeviceRepairController {
+public class DeviceRepairController extends BaseController {
 
     private IDeviceRepairService deviceRepairService;
 
     @Operation(summary = "璁惧鎶ヤ慨鍒楄〃")
     @GetMapping("/page")
-    public AjaxResult page(Page page , DeviceRepairDto deviceRepairDto) {
-        return AjaxResult.success(deviceRepairService.queryPage(page,deviceRepairDto));
+    public R<?> page(Page page , DeviceRepairDto deviceRepairDto) {
+        return R.ok(deviceRepairService.queryPage(page,deviceRepairDto));
     }
 
     @PostMapping()
     @Operation(summary = "娣诲姞璁惧鎶ヤ慨")
-    public AjaxResult add( @RequestBody DeviceRepairDto deviceRepairDto) {
+    public R<?> add( @RequestBody DeviceRepairDto deviceRepairDto) {
         return deviceRepairService.saveDeviceRepair(deviceRepairDto);
     }
 
     @Operation(summary = "鏍规嵁id鏌ヨ璁惧鎶ヤ慨")
     @GetMapping("/{id}")
-    public AjaxResult detail(@PathVariable Long id) {
-        return AjaxResult.success(deviceRepairService.detailById(id));
+    public R<?> detail(@PathVariable Long id) {
+        return R.ok(deviceRepairService.detailById(id));
     }
 
     @PutMapping ()
     @Operation(summary = "淇敼璁惧鎶ヤ慨")
-    public AjaxResult update( @RequestBody DeviceRepairDto deviceRepairDto) {
+    public R<?> update( @RequestBody DeviceRepairDto deviceRepairDto) {
         return deviceRepairService.updateDeviceRepair(deviceRepairDto);
     }
 
     @PostMapping ("/repair")
     @Operation(summary = "璁惧缁翠慨")
-    public AjaxResult repair( @RequestBody DeviceRepairDto deviceRepairDto) {
+    public R<?> repair( @RequestBody DeviceRepairDto deviceRepairDto) {
         return deviceRepairService.confirmRepair(deviceRepairDto);
     }
 
     @PostMapping ("/acceptance")
     @Operation(summary = "璁惧鎶ヤ慨楠屾敹瀹℃壒")
-    public AjaxResult acceptance(@RequestBody DeviceRepairDto deviceRepairDto) {
+    public R<?> acceptance(@RequestBody DeviceRepairDto deviceRepairDto) {
         return deviceRepairService.approveRepairAcceptance(deviceRepairDto);
     }
 
     @DeleteMapping("/{ids}")
     @Operation(summary = "鍒犻櫎璁惧鎶ヤ慨")
-    public AjaxResult delete(@PathVariable("ids") Long[] ids) {
+    public R<?> delete(@PathVariable("ids") Long[] ids) {
         boolean b = deviceRepairService.removeBatchByIds(Arrays.asList(ids));
         if (!b) {
-            return AjaxResult.error("鍒犻櫎澶辫触");
+            return R.fail("鍒犻櫎澶辫触");
         }
-        return AjaxResult.success();
+        return R.ok();
     }
 
     @PostMapping("export")
diff --git a/src/main/java/com/ruoyi/device/controller/MaintenanceTaskController.java b/src/main/java/com/ruoyi/device/controller/MaintenanceTaskController.java
index b6f8c27..76fefc3 100644
--- a/src/main/java/com/ruoyi/device/controller/MaintenanceTaskController.java
+++ b/src/main/java/com/ruoyi/device/controller/MaintenanceTaskController.java
@@ -6,7 +6,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.AllArgsConstructor;
@@ -31,7 +31,7 @@
 
     @GetMapping("/listPage")
     @Operation(summary = "璁惧淇濆吇瀹氭椂浠诲姟鍒楄〃")
-    public AjaxResult listPage(Page page, MaintenanceTask maintenanceTask) {
+    public R<?> listPage(Page page, MaintenanceTask maintenanceTask) {
         return maintenanceTaskService.listPage(page,maintenanceTask);
     }
 
@@ -39,21 +39,21 @@
     @PostMapping("/add")
     @Operation(summary = "娣诲姞璁惧淇濆吇瀹氭椂浠诲姟")
     @Log(title = "璁惧淇濆吇瀹氭椂浠诲姟", businessType = BusinessType.INSERT)
-    public AjaxResult add(@RequestBody MaintenanceTask maintenanceTask) {
+    public R<?> add(@RequestBody MaintenanceTask maintenanceTask) {
         return maintenanceTaskService.add(maintenanceTask);
     }
 
     @PostMapping("/update")
     @Operation(summary = "淇敼璁惧淇濆吇瀹氭椂浠诲姟")
     @Log(title = "璁惧淇濆吇瀹氭椂浠诲姟", businessType = BusinessType.UPDATE)
-    public AjaxResult update(@RequestBody MaintenanceTask maintenanceTask) {
+    public R<?> update(@RequestBody MaintenanceTask maintenanceTask) {
         return maintenanceTaskService.updateByMaintenanceTaskId(maintenanceTask);
     }
 
     @DeleteMapping("/delete")
     @Operation(summary = "鍒犻櫎璁惧淇濆吇瀹氭椂浠诲姟")
     @Log(title = "璁惧淇濆吇瀹氭椂浠诲姟", businessType = BusinessType.DELETE)
-    public AjaxResult delete(@RequestBody List<Long> ids) {
+    public R<?> delete(@RequestBody List<Long> ids) {
         return maintenanceTaskService.delete(ids);
     }
 
diff --git a/src/main/java/com/ruoyi/device/service/IDeviceLedgerService.java b/src/main/java/com/ruoyi/device/service/IDeviceLedgerService.java
index d34ea65..a0d954e 100644
--- a/src/main/java/com/ruoyi/device/service/IDeviceLedgerService.java
+++ b/src/main/java/com/ruoyi/device/service/IDeviceLedgerService.java
@@ -5,7 +5,7 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.device.dto.DeviceLedgerDto;
 import com.ruoyi.device.pojo.DeviceLedger;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import org.springframework.web.multipart.MultipartFile;
 
 import jakarta.servlet.http.HttpServletResponse;
@@ -14,9 +14,9 @@
 public interface IDeviceLedgerService  extends IService<DeviceLedger> {
     IPage<DeviceLedgerDto> queryPage(Page page, DeviceLedgerDto deviceLedger);
 
-    AjaxResult saveDeviceLedger(DeviceLedger deviceLedger);
+    R<?> saveDeviceLedger(DeviceLedger deviceLedger);
 
-    AjaxResult updateDeviceLedger(DeviceLedger deviceLedger);
+    R<?> updateDeviceLedger(DeviceLedger deviceLedger);
 
     void export(HttpServletResponse response, Long[] ids);
 
diff --git a/src/main/java/com/ruoyi/device/service/IDeviceMaintenanceService.java b/src/main/java/com/ruoyi/device/service/IDeviceMaintenanceService.java
index e5a4080..6f0077f 100644
--- a/src/main/java/com/ruoyi/device/service/IDeviceMaintenanceService.java
+++ b/src/main/java/com/ruoyi/device/service/IDeviceMaintenanceService.java
@@ -6,7 +6,7 @@
 import com.ruoyi.device.dto.DeviceMaintenanceDto;
 import com.ruoyi.device.pojo.DeviceMaintenance;
 import com.ruoyi.device.vo.DeviceMaintenanceVo;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 
 import jakarta.servlet.http.HttpServletResponse;
 
@@ -14,9 +14,9 @@
 
     IPage<DeviceMaintenanceDto> queryPage(Page page, DeviceMaintenanceDto deviceMaintenanceDto);
 
-    AjaxResult saveDeviceRepair(DeviceMaintenanceDto deviceMaintenance);
+    R<?> saveDeviceRepair(DeviceMaintenanceDto deviceMaintenance);
 
-    AjaxResult updateDeviceDeviceMaintenance(DeviceMaintenanceDto deviceMaintenance);
+    R<?> updateDeviceDeviceMaintenance(DeviceMaintenanceDto deviceMaintenance);
 
     void export(HttpServletResponse response, Long[] ids);
 
diff --git a/src/main/java/com/ruoyi/device/service/IDeviceRepairService.java b/src/main/java/com/ruoyi/device/service/IDeviceRepairService.java
index ae0b913..f6e112c 100644
--- a/src/main/java/com/ruoyi/device/service/IDeviceRepairService.java
+++ b/src/main/java/com/ruoyi/device/service/IDeviceRepairService.java
@@ -6,7 +6,7 @@
 import com.ruoyi.device.dto.DeviceRepairDto;
 import com.ruoyi.device.pojo.DeviceRepair;
 import com.ruoyi.device.vo.DeviceRepairVo;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 
 import jakarta.servlet.http.HttpServletResponse;
 
@@ -15,13 +15,13 @@
 
     IPage<DeviceRepairVo> queryPage(Page page, DeviceRepairDto deviceRepairDto);
 
-    AjaxResult saveDeviceRepair(DeviceRepairDto deviceRepairDto);
+    R<?> saveDeviceRepair(DeviceRepairDto deviceRepairDto);
 
-    AjaxResult updateDeviceRepair(DeviceRepairDto deviceRepairDto);
+    R<?> updateDeviceRepair(DeviceRepairDto deviceRepairDto);
 
-    AjaxResult confirmRepair(DeviceRepairDto deviceRepairDto);
+    R<?> confirmRepair(DeviceRepairDto deviceRepairDto);
 
-    AjaxResult approveRepairAcceptance(DeviceRepairDto deviceRepairDto);
+    R<?> approveRepairAcceptance(DeviceRepairDto deviceRepairDto);
 
     void export(HttpServletResponse response, Long[] ids);
 
diff --git a/src/main/java/com/ruoyi/device/service/MaintenanceTaskService.java b/src/main/java/com/ruoyi/device/service/MaintenanceTaskService.java
index 19cb6ed..3364d0a 100644
--- a/src/main/java/com/ruoyi/device/service/MaintenanceTaskService.java
+++ b/src/main/java/com/ruoyi/device/service/MaintenanceTaskService.java
@@ -3,7 +3,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.device.pojo.MaintenanceTask;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 
 import java.util.List;
 
@@ -12,11 +12,11 @@
  * @date : 2025/12/22 14:56
  */
 public interface MaintenanceTaskService extends IService<MaintenanceTask> {
-    AjaxResult listPage(Page page, MaintenanceTask maintenanceTask);
+    R<?> listPage(Page page, MaintenanceTask maintenanceTask);
 
-    AjaxResult add(MaintenanceTask maintenanceTask);
+    R<?> add(MaintenanceTask maintenanceTask);
 
-    AjaxResult updateByMaintenanceTaskId(MaintenanceTask maintenanceTask);
+    R<?> updateByMaintenanceTaskId(MaintenanceTask maintenanceTask);
 
-    AjaxResult delete(List<Long> ids);
+    R<?> delete(List<Long> ids);
 }
diff --git a/src/main/java/com/ruoyi/device/service/impl/DeviceLedgerServiceImpl.java b/src/main/java/com/ruoyi/device/service/impl/DeviceLedgerServiceImpl.java
index b4c5d65..2b9c9be 100644
--- a/src/main/java/com/ruoyi/device/service/impl/DeviceLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/device/service/impl/DeviceLedgerServiceImpl.java
@@ -13,7 +13,7 @@
 import com.ruoyi.device.mapper.DeviceLedgerMapper;
 import com.ruoyi.device.pojo.DeviceLedger;
 import com.ruoyi.device.service.IDeviceLedgerService;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.mapper.SysUserMapper;
 import jakarta.servlet.http.HttpServletResponse;
@@ -44,25 +44,25 @@
     }
 
     @Override
-    public AjaxResult saveDeviceLedger(DeviceLedger deviceLedger) {
+    public R<?> saveDeviceLedger(DeviceLedger deviceLedger) {
         LambdaQueryWrapper<DeviceLedger> deviceLedgerLambdaQueryWrapper = new LambdaQueryWrapper<>();
         deviceLedgerLambdaQueryWrapper.eq(DeviceLedger::getDeviceName,deviceLedger.getDeviceName());
         if (this.count(deviceLedgerLambdaQueryWrapper) > 0) {
-            return AjaxResult.error("璁惧鍚嶇О宸插瓨鍦�");
+            return R.fail("璁惧鍚嶇О宸插瓨鍦�");
         }
         boolean save = this.save(deviceLedger);
         if (save){
-            return AjaxResult.success();
+            return R.ok();
         }
-        return AjaxResult.error();
+        return R.fail();
     }
 
     @Override
-    public AjaxResult updateDeviceLedger(DeviceLedger deviceLedger) {
+    public R<?> updateDeviceLedger(DeviceLedger deviceLedger) {
         if (this.updateById(deviceLedger)) {
-            return AjaxResult.success();
+            return R.ok();
         }
-        return AjaxResult.error();
+        return R.fail();
     }
 
     @Override
diff --git a/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java b/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java
index fbf03ad..779714f 100644
--- a/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java
+++ b/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java
@@ -15,7 +15,7 @@
 import com.ruoyi.device.service.IDeviceMaintenanceService;
 import com.ruoyi.device.vo.DeviceMaintenanceVo;
 import com.ruoyi.device.vo.DeviceRepairVo;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.measuringinstrumentledger.mapper.SparePartsMapper;
 import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
 import com.ruoyi.measuringinstrumentledger.pojo.SparePartsRequisitionRecord;
@@ -48,19 +48,19 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult saveDeviceRepair(DeviceMaintenanceDto deviceMaintenance) {
+    public R<?> saveDeviceRepair(DeviceMaintenanceDto deviceMaintenance) {
         boolean save = this.save(deviceMaintenance);
         if (save){
             // 澶勭悊鍥剧墖涓婁紶
             fileUtil.saveStorageAttachmentByRecordTypeAndRecordId("file", RecordTypeEnum.DEVICE_MAINTENANCE, deviceMaintenance.getId(), deviceMaintenance.getStorageBlobDTOs());
-            return AjaxResult.success();
+            return R.ok();
         }
-        return AjaxResult.error();
+        return R.fail();
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult updateDeviceDeviceMaintenance(DeviceMaintenanceDto deviceMaintenance) {
+    public R<?> updateDeviceDeviceMaintenance(DeviceMaintenanceDto deviceMaintenance) {
         DeviceMaintenance oldDeviceMaintenance = this.getById(deviceMaintenance.getId());
         // 澶勭悊澶囦欢浣跨敤鎯呭喌
         if (com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(deviceMaintenance.getSparePartsUseList())) {
@@ -85,7 +85,7 @@
                         record.setQuantity(sparePartUse.getQuantity());
                         sparePartsRequisitionRecordService.save(record);
                     } else {
-                        return AjaxResult.error("澶囦欢 " + spareParts.getName() + " 鏁伴噺涓嶈冻");
+                        return R.fail("澶囦欢 " + spareParts.getName() + " 鏁伴噺涓嶈冻");
                     }
                 }
             }
@@ -98,9 +98,9 @@
         if (this.updateById(deviceMaintenance)) {
             // 澶勭悊鍥剧墖涓婁紶
             fileUtil.saveStorageAttachmentByRecordTypeAndRecordId("file", RecordTypeEnum.DEVICE_MAINTENANCE, deviceMaintenance.getId(), deviceMaintenance.getStorageBlobDTOs());
-            return AjaxResult.success();
+            return R.ok();
         }
-        return AjaxResult.error();
+        return R.fail();
     }
 
     @Override
diff --git a/src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java b/src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java
index e5a73ac..98f0d27 100644
--- a/src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java
+++ b/src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java
@@ -18,7 +18,7 @@
 import com.ruoyi.device.service.IDeviceLedgerService;
 import com.ruoyi.device.service.IDeviceRepairService;
 import com.ruoyi.device.vo.DeviceRepairVo;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.measuringinstrumentledger.mapper.SparePartsMapper;
 import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
 import com.ruoyi.measuringinstrumentledger.pojo.SparePartsRequisitionRecord;
@@ -63,7 +63,7 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult saveDeviceRepair(DeviceRepairDto deviceRepairDto) {
+    public R<?> saveDeviceRepair(DeviceRepairDto deviceRepairDto) {
         DeviceLedger byId = deviceLedgerService.getById(deviceRepairDto.getDeviceLedgerId());
         deviceRepairDto.setDeviceName(byId.getDeviceName());
         deviceRepairDto.setDeviceModel(byId.getDeviceModel());
@@ -74,23 +74,23 @@
         if (save) {
             // 澶勭悊鍥剧墖涓婁紶
             fileUtil.saveStorageAttachmentByRecordTypeAndRecordId("file", RecordTypeEnum.DEVICE_REPAIR, deviceRepairDto.getId(), deviceRepairDto.getStorageBlobDTOs());
-            return AjaxResult.success();
+            return R.ok();
         }
-        return AjaxResult.error("淇濆瓨澶辫触");
+        return R.fail("淇濆瓨澶辫触");
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult updateDeviceRepair(DeviceRepairDto deviceRepairDto) {
+    public R<?> updateDeviceRepair(DeviceRepairDto deviceRepairDto) {
         DeviceRepair oldDeviceRepair = this.getById(deviceRepairDto.getId());
         if (oldDeviceRepair == null) {
-            return AjaxResult.error("鎶ヤ慨璁板綍涓嶅瓨鍦�");
+            return R.fail("鎶ヤ慨璁板綍涓嶅瓨鍦�");
         }
         if (deviceRepairDto.getStatus() != null
                 && deviceRepairDto.getStatus() == STATUS_COMPLETED
                 && (oldDeviceRepair.getStatus() == null
                 || oldDeviceRepair.getStatus() != STATUS_COMPLETED)) {
-            return AjaxResult.error("璇峰厛鎻愪氦楠屾敹瀹℃壒锛岄獙鏀堕�氳繃鍚庢墠鍙畬缁�");
+            return R.fail("璇峰厛鎻愪氦楠屾敹瀹℃壒锛岄獙鏀堕�氳繃鍚庢墠鍙畬缁�");
         }
         // 澶勭悊澶囦欢浣跨敤鎯呭喌
         if (CollectionUtils.isNotEmpty(deviceRepairDto.getSparePartsUseList())) {
@@ -115,7 +115,7 @@
                         record.setQuantity(sparePartUse.getQuantity());
                         sparePartsRequisitionRecordService.save(record);
                     } else {
-                        return AjaxResult.error("澶囦欢 " + spareParts.getName() + " 鏁伴噺涓嶈冻");
+                        return R.fail("澶囦欢 " + spareParts.getName() + " 鏁伴噺涓嶈冻");
                     }
                 }
             }
@@ -142,23 +142,23 @@
             if (deviceRepairDto.getStorageBlobDTOs() != null) {
                 fileUtil.saveStorageAttachmentByRecordTypeAndRecordId("file", RecordTypeEnum.DEVICE_REPAIR, id, deviceRepairDto.getStorageBlobDTOs());
             }
-            return AjaxResult.success();
+            return R.ok();
         }
-        return AjaxResult.error();
+        return R.fail();
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult confirmRepair(DeviceRepairDto deviceRepairDto) {
+    public R<?> confirmRepair(DeviceRepairDto deviceRepairDto) {
         DeviceRepair oldDeviceRepair = this.getById(deviceRepairDto.getId());
         if (oldDeviceRepair == null) {
-            return AjaxResult.error("鎶ヤ慨璁板綍涓嶅瓨鍦�");
+            return R.fail("鎶ヤ慨璁板綍涓嶅瓨鍦�");
         }
         if (oldDeviceRepair.getStatus() != null && oldDeviceRepair.getStatus() == STATUS_COMPLETED) {
-            return AjaxResult.error("璇ユ姤淇凡瀹岀粨锛屼笉鑳介噸澶嶇‘璁ょ淮淇�");
+            return R.fail("璇ユ姤淇凡瀹岀粨锛屼笉鑳介噸澶嶇‘璁ょ淮淇�");
         }
         if (oldDeviceRepair.getStatus() != null && oldDeviceRepair.getStatus() == STATUS_PENDING_ACCEPTANCE) {
-            return AjaxResult.error("璇ユ姤淇凡鎻愪氦楠屾敹瀹℃壒");
+            return R.fail("璇ユ姤淇凡鎻愪氦楠屾敹瀹℃壒");
         }
         deviceRepairDto.setStatus(STATUS_PENDING_ACCEPTANCE);
         return updateDeviceRepair(deviceRepairDto);
@@ -166,25 +166,25 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult approveRepairAcceptance(DeviceRepairDto deviceRepairDto) {
+    public R<?> approveRepairAcceptance(DeviceRepairDto deviceRepairDto) {
         if (deviceRepairDto.getId() == null) {
-            return AjaxResult.error("鎶ヤ慨璁板綍id涓嶈兘涓虹┖");
+            return R.fail("鎶ヤ慨璁板綍id涓嶈兘涓虹┖");
         }
         DeviceRepair oldDeviceRepair = this.getById(deviceRepairDto.getId());
         if (oldDeviceRepair == null) {
-            return AjaxResult.error("鎶ヤ慨璁板綍涓嶅瓨鍦�");
+            return R.fail("鎶ヤ慨璁板綍涓嶅瓨鍦�");
         }
         if (oldDeviceRepair.getStatus() == null || oldDeviceRepair.getStatus() != STATUS_PENDING_ACCEPTANCE) {
-            return AjaxResult.error("璇ユ姤淇湭杩涘叆寰呴獙鏀剁姸鎬侊紝涓嶈兘瀹℃壒");
+            return R.fail("璇ユ姤淇湭杩涘叆寰呴獙鏀剁姸鎬侊紝涓嶈兘瀹℃壒");
         }
         if (StringUtils.isBlank(deviceRepairDto.getAcceptanceName())) {
-            return AjaxResult.error("楠屾敹浜轰笉鑳戒负绌�");
+            return R.fail("楠屾敹浜轰笉鑳戒负绌�");
         }
         if (deviceRepairDto.getAcceptanceTime() == null) {
-            return AjaxResult.error("楠屾敹鏃堕棿涓嶈兘涓虹┖");
+            return R.fail("楠屾敹鏃堕棿涓嶈兘涓虹┖");
         }
         if (StringUtils.isBlank(deviceRepairDto.getAcceptanceRemark())) {
-            return AjaxResult.error("楠屾敹澶囨敞涓嶈兘涓虹┖");
+            return R.fail("楠屾敹澶囨敞涓嶈兘涓虹┖");
         }
 
         DeviceRepair update = new DeviceRepair();
@@ -194,9 +194,9 @@
         update.setAcceptanceRemark(deviceRepairDto.getAcceptanceRemark());
         update.setStatus(STATUS_COMPLETED);
         if (this.updateById(update)) {
-            return AjaxResult.success();
+            return R.ok();
         }
-        return AjaxResult.error("楠屾敹瀹℃壒澶辫触");
+        return R.fail("楠屾敹瀹℃壒澶辫触");
     }
 
     @Override
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 3aaac94..8d0caee 100644
--- a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
+++ b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
@@ -6,7 +6,8 @@
 import com.ruoyi.device.mapper.MaintenanceTaskMapper;
 import com.ruoyi.device.pojo.MaintenanceTask;
 import com.ruoyi.device.service.MaintenanceTaskService;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.common.constant.HttpStatus;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.inspectiontask.pojo.TimingTask;
 import com.ruoyi.inspectiontask.service.impl.TimingTaskServiceImpl;
 import com.ruoyi.project.system.domain.SysUser;
@@ -33,11 +34,11 @@
     private final MaintenanceTaskScheduler maintenanceTaskScheduler;
 
     @Override
-    public AjaxResult listPage(Page page, MaintenanceTask maintenanceTask) {
+    public R<?> listPage(Page page, MaintenanceTask maintenanceTask) {
         Page<MaintenanceTask> taskPage = maintenanceTaskMapper.selectPage(page, null);
         // 2. 濡傛灉娌℃湁鏁版嵁锛岀洿鎺ヨ繑鍥炵┖鍒嗛〉
         if (taskPage.getRecords().isEmpty()) {
-            return AjaxResult.success(taskPage);
+            return R.ok(taskPage);
         }
 
         // 3. 鏀堕泦鎵�鏈夐渶瑕佹煡璇㈢殑鐢ㄦ埛ID
@@ -62,11 +63,11 @@
                 task.setRegistrant(userNickNameMap.getOrDefault(task.getRegistrantId(), "鏈煡鐢ㄦ埛"));
             }
         });
-        return AjaxResult.success(taskPage);
+        return R.ok(taskPage);
     }
 
     @Override
-    public AjaxResult add(MaintenanceTask maintenanceTask) {
+    public R<?> add(MaintenanceTask maintenanceTask) {
         maintenanceTask.setActive(true);
         // 璁$畻棣栨鎵ц鏃堕棿
         TimingTask task = new TimingTask();
@@ -78,31 +79,31 @@
         if (insert > 0) {
             maintenanceTaskScheduler.scheduleMaintenanceTask(maintenanceTask);
         }
-        return AjaxResult.success("娣诲姞鎴愬姛");
+        return R.ok(null, "娣诲姞鎴愬姛");
     }
 
     @Override
-    public AjaxResult updateByMaintenanceTaskId(MaintenanceTask maintenanceTask) {
+    public R<?> updateByMaintenanceTaskId(MaintenanceTask maintenanceTask) {
         MaintenanceTask maintenanceTask1 = maintenanceTaskMapper.selectById(maintenanceTask.getId());
         if (maintenanceTask1 == null) {
-            return AjaxResult.warn("娌℃湁姝ゆ暟鎹�");
+            return R.fail(HttpStatus.WARN, "娌℃湁姝ゆ暟鎹�");
         }
         BeanUtils.copyProperties(maintenanceTask, maintenanceTask1);
         int update = maintenanceTaskMapper.updateById(maintenanceTask1);
         if (update > 0) {
             maintenanceTaskScheduler.rescheduleMaintenanceTask(maintenanceTask1);
         }
-        return AjaxResult.success("鏇存柊鎴愬姛");
+        return R.ok(null, "鏇存柊鎴愬姛");
     }
 
     @Override
-    public AjaxResult delete(List<Long> ids) {
+    public R<?> delete(List<Long> ids) {
         int delete = maintenanceTaskMapper.deleteBatchIds(ids);
         if (delete > 0) {
             ids.forEach(id -> {
                 maintenanceTaskScheduler.unscheduleMaintenanceTask(id);
             });
         }
-        return AjaxResult.success("鍒犻櫎鎴愬姛");
+        return R.ok(null, "鍒犻櫎鎴愬姛");
     }
 }
diff --git a/src/main/java/com/ruoyi/equipmentenergyconsumption/controller/ElectricityConsumptionAreaController.java b/src/main/java/com/ruoyi/equipmentenergyconsumption/controller/ElectricityConsumptionAreaController.java
index bba6088..c08958b 100644
--- a/src/main/java/com/ruoyi/equipmentenergyconsumption/controller/ElectricityConsumptionAreaController.java
+++ b/src/main/java/com/ruoyi/equipmentenergyconsumption/controller/ElectricityConsumptionAreaController.java
@@ -8,7 +8,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.AllArgsConstructor;
@@ -36,26 +36,26 @@
     @GetMapping("/listPage")
     @Operation(summary = "鐢ㄧ數鍖哄煙-鍒嗛〉鏌ヨ")
     @Log(title = "鐢ㄧ數鍖哄煙-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
-    public AjaxResult listPage(Page page, ElectricityConsumptionArea electricityConsumptionArea) {
+    public R<?> listPage(Page page, ElectricityConsumptionArea electricityConsumptionArea) {
         IPage<ElectricityConsumptionArea> listPage = electricityConsumptionAreaService.listPage(page, electricityConsumptionArea);
-        return AjaxResult.success(listPage);
+        return R.ok(listPage);
     }
 
     @PostMapping("/add")
     @Operation(summary = "鐢ㄧ數鍖哄煙-鏂板")
     @Log(title = "鐢ㄧ數鍖哄煙-鏂板", businessType = BusinessType.INSERT)
-    public AjaxResult add(@RequestBody ElectricityConsumptionArea electricityConsumptionArea) {
+    public R<?> add(@RequestBody ElectricityConsumptionArea electricityConsumptionArea) {
         boolean save = electricityConsumptionAreaService.saveOrUpdate(electricityConsumptionArea);
-        return save ? AjaxResult.success() : AjaxResult.error();
+        return save ? R.ok() : R.fail();
     }
 
     @DeleteMapping("/delete")
     @Operation(summary = "鐢ㄧ數鍖哄煙-鍒犻櫎")
     @Log(title = "鐢ㄧ數鍖哄煙-鍒犻櫎", businessType = BusinessType.DELETE)
-    public AjaxResult delete(@RequestBody List<Long> ids) {
-        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+    public R<?> delete(@RequestBody List<Long> ids) {
+        if(CollectionUtils.isEmpty(ids)) return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         boolean remove = electricityConsumptionAreaService.removeBatchByIds(ids);
-        return remove ? AjaxResult.success() : AjaxResult.error();
+        return remove ? R.ok() : R.fail();
     }
 
 }
diff --git a/src/main/java/com/ruoyi/equipmentenergyconsumption/controller/EnergyPeriodController.java b/src/main/java/com/ruoyi/equipmentenergyconsumption/controller/EnergyPeriodController.java
index e0409b5..e0f3ed1 100644
--- a/src/main/java/com/ruoyi/equipmentenergyconsumption/controller/EnergyPeriodController.java
+++ b/src/main/java/com/ruoyi/equipmentenergyconsumption/controller/EnergyPeriodController.java
@@ -8,7 +8,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import jakarta.servlet.http.HttpServletResponse;
@@ -28,42 +28,42 @@
     @GetMapping("/listPage")
     @Operation(summary = "鐢ㄧ數鏃舵-鍒嗛〉鏌ヨ")
     @Log(title = "鐢ㄧ數鏃舵-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
-    public AjaxResult listPage(Page page, EnergyPeriod energyPeriod) {
+    public R<?> listPage(Page page, EnergyPeriod energyPeriod) {
         IPage<EnergyPeriod> listPage = energyPeriodService.listPage(page, energyPeriod);
-        return AjaxResult.success(listPage);
+        return R.ok(listPage);
     }
 
     @PostMapping("/add")
     @Operation(summary = "鐢ㄧ數鏃舵-鏂板")
     @Log(title = "鐢ㄧ數鏃舵-鏂板", businessType = BusinessType.INSERT)
-    public AjaxResult add(@RequestBody EnergyPeriod energyPeriod) {
+    public R<?> add(@RequestBody EnergyPeriod energyPeriod) {
         boolean save = energyPeriodService.save(energyPeriod);
-        return save ? AjaxResult.success() : AjaxResult.error();
+        return save ? R.ok() : R.fail();
     }
 
     @PostMapping("/addBatch")
     @Operation(summary = "鐢ㄧ數鏃舵-鎵归噺鏂板")
     @Log(title = "鐢ㄧ數鏃舵-鎵归噺鏂板", businessType = BusinessType.INSERT)
-    public AjaxResult addBatch(@RequestBody List<EnergyPeriod> energyPeriods) {
+    public R<?> addBatch(@RequestBody List<EnergyPeriod> energyPeriods) {
         boolean save = energyPeriodService.saveBatch(energyPeriods);
-        return save ? AjaxResult.success() : AjaxResult.error();
+        return save ? R.ok() : R.fail();
     }
 
     @PostMapping("/update")
     @Operation(summary = "鐢ㄧ數鏃舵-淇敼")
     @Log(title = "鐢ㄧ數鏃舵-淇敼", businessType = BusinessType.UPDATE)
-    public AjaxResult update(@RequestBody EnergyPeriod energyPeriod) {
+    public R<?> update(@RequestBody EnergyPeriod energyPeriod) {
         boolean update = energyPeriodService.updateById(energyPeriod);
-        return update ? AjaxResult.success() : AjaxResult.error();
+        return update ? R.ok() : R.fail();
     }
 
     @DeleteMapping("/delete")
     @Operation(summary = "鐢ㄧ數鏃舵-鍒犻櫎")
     @Log(title = "鐢ㄧ數鏃舵-鍒犻櫎", businessType = BusinessType.DELETE)
-    public AjaxResult delete(@RequestBody List<Long> ids) {
-        if (CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+    public R<?> delete(@RequestBody List<Long> ids) {
+        if (CollectionUtils.isEmpty(ids)) return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         boolean remove = energyPeriodService.removeBatchByIds(ids);
-        return remove ? AjaxResult.success() : AjaxResult.error("鍒犻櫎澶辫触");
+        return remove ? R.ok() : R.fail("鍒犻櫎澶辫触");
     }
 
 
diff --git a/src/main/java/com/ruoyi/equipmentenergyconsumption/controller/EquipmentEnergyConsumptionController.java b/src/main/java/com/ruoyi/equipmentenergyconsumption/controller/EquipmentEnergyConsumptionController.java
index d401a99..c18d5f7 100644
--- a/src/main/java/com/ruoyi/equipmentenergyconsumption/controller/EquipmentEnergyConsumptionController.java
+++ b/src/main/java/com/ruoyi/equipmentenergyconsumption/controller/EquipmentEnergyConsumptionController.java
@@ -12,7 +12,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.AllArgsConstructor;
@@ -41,50 +41,50 @@
     @GetMapping("/listPage")
     @Operation(summary = "璁惧鑳借��-鍒嗛〉鏌ヨ")
     @Log(title = "璁惧鑳借��-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
-    public AjaxResult listPage(Page page, EquipmentEnergyConsumption equipmentEnergyConsumption) {
+    public R<?> listPage(Page page, EquipmentEnergyConsumption equipmentEnergyConsumption) {
         IPage<EquipmentEnergyConsumption> listPage = equipmentEnergyConsumptionService.listPage(page, equipmentEnergyConsumption);
-        return AjaxResult.success(listPage);
+        return R.ok(listPage);
     }
 
     @GetMapping("/deviceList")
     @Operation(summary = "璁惧鍙拌处-鏌ヨ")
     @Log(title = "璁惧鍙拌处-鏌ヨ", businessType = BusinessType.OTHER)
-    public AjaxResult deviceList(DeviceLedger deviceLedger) {
+    public R<?> deviceList(DeviceLedger deviceLedger) {
         List<DeviceLedger> listPage = equipmentEnergyConsumptionService.deviceList(deviceLedger);
-        return AjaxResult.success(listPage);
+        return R.ok(listPage);
     }
 
     @PostMapping("/add")
     @Operation(summary = "璁惧鑳借��-鏂板")
     @Log(title = "璁惧鑳借��-鏂板", businessType = BusinessType.INSERT)
-    public AjaxResult add(@RequestBody EquipmentEnergyConsumption equipmentEnergyConsumption) {
+    public R<?> add(@RequestBody EquipmentEnergyConsumption equipmentEnergyConsumption) {
         boolean save = equipmentEnergyConsumptionService.save(equipmentEnergyConsumption);
-        return save ? AjaxResult.success() : AjaxResult.error();
+        return save ? R.ok() : R.fail();
     }
 
     @PostMapping("/addBatch")
     @Operation(summary = "璁惧鑳借��-鎵归噺鏂板")
     @Log(title = "璁惧鑳借��-鎵归噺鏂板", businessType = BusinessType.INSERT)
-    public AjaxResult addBatch(@RequestBody List<EquipmentEnergyConsumption> list) {
+    public R<?> addBatch(@RequestBody List<EquipmentEnergyConsumption> list) {
         boolean save = equipmentEnergyConsumptionService.saveBatch(list);
-        return save ? AjaxResult.success() : AjaxResult.error();
+        return save ? R.ok() : R.fail();
     }
 
     @PostMapping("/update")
     @Operation(summary = "璁惧鑳借��-淇敼")
     @Log(title = "璁惧鑳借��-淇敼", businessType = BusinessType.UPDATE)
-    public AjaxResult update(@RequestBody EquipmentEnergyConsumption equipmentEnergyConsumption) {
+    public R<?> update(@RequestBody EquipmentEnergyConsumption equipmentEnergyConsumption) {
         boolean update = equipmentEnergyConsumptionService.updateById(equipmentEnergyConsumption);
-        return update ? AjaxResult.success() : AjaxResult.error();
+        return update ? R.ok() : R.fail();
     }
 
     @DeleteMapping("/delete")
     @Operation(summary = "璁惧鑳借��-鍒犻櫎")
     @Log(title = "璁惧鑳借��-鍒犻櫎", businessType = BusinessType.DELETE)
-    public AjaxResult delete(@RequestBody List<Long> ids) {
-        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+    public R<?> delete(@RequestBody List<Long> ids) {
+        if(CollectionUtils.isEmpty(ids)) return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         boolean remove = equipmentEnergyConsumptionService.removeBatchByIds(ids);
-        return remove ? AjaxResult.success() : AjaxResult.error();
+        return remove ? R.ok() : R.fail();
     }
 
     /**
@@ -93,7 +93,7 @@
     @Log(title = "瀵煎叆璁惧鑳借��", businessType = BusinessType.IMPORT)
     @PostMapping("/importData")
     @Operation(summary = "瀵煎叆璁惧鑳借��")
-    public AjaxResult importData(MultipartFile file) throws Exception {
+    public R<?> importData(MultipartFile file) throws Exception {
         return equipmentEnergyConsumptionService.importData(file);
     }
 
@@ -114,9 +114,9 @@
     @GetMapping("/listPageByTrend")
     @Operation(summary = "璁惧鑳借��-鑳芥簮瓒嬪娍-鍒嗛〉鏌ヨ")
     @Log(title = "璁惧鑳借��-鑳芥簮瓒嬪娍-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
-    public AjaxResult listPageByTrend(Page page, EquipmentEnergyConsumption equipmentEnergyConsumption) {
+    public R<?> listPageByTrend(Page page, EquipmentEnergyConsumption equipmentEnergyConsumption) {
         IPage<EquipmentEnergyConsumption> listPage = equipmentEnergyConsumptionService.listPageByTrend(page, equipmentEnergyConsumption);
-        return AjaxResult.success(listPage);
+        return R.ok(listPage);
     }
 
     /**
diff --git a/src/main/java/com/ruoyi/equipmentenergyconsumption/service/EquipmentEnergyConsumptionService.java b/src/main/java/com/ruoyi/equipmentenergyconsumption/service/EquipmentEnergyConsumptionService.java
index 830e808..fabe267 100644
--- a/src/main/java/com/ruoyi/equipmentenergyconsumption/service/EquipmentEnergyConsumptionService.java
+++ b/src/main/java/com/ruoyi/equipmentenergyconsumption/service/EquipmentEnergyConsumptionService.java
@@ -5,7 +5,7 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.device.pojo.DeviceLedger;
 import com.ruoyi.equipmentenergyconsumption.pojo.EquipmentEnergyConsumption;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
@@ -19,7 +19,7 @@
 
     IPage<EquipmentEnergyConsumption> listPage(Page page, EquipmentEnergyConsumption equipmentEnergyConsumption);
 
-    AjaxResult importData(MultipartFile file);
+    R<?> importData(MultipartFile file);
 
     IPage<EquipmentEnergyConsumption> listPageByTrend(Page page, EquipmentEnergyConsumption equipmentEnergyConsumption);
 
diff --git a/src/main/java/com/ruoyi/equipmentenergyconsumption/service/impl/EquipmentEnergyConsumptionServiceImpl.java b/src/main/java/com/ruoyi/equipmentenergyconsumption/service/impl/EquipmentEnergyConsumptionServiceImpl.java
index 486ad48..063a163 100644
--- a/src/main/java/com/ruoyi/equipmentenergyconsumption/service/impl/EquipmentEnergyConsumptionServiceImpl.java
+++ b/src/main/java/com/ruoyi/equipmentenergyconsumption/service/impl/EquipmentEnergyConsumptionServiceImpl.java
@@ -10,7 +10,8 @@
 import com.ruoyi.equipmentenergyconsumption.mapper.EquipmentEnergyConsumptionMapper;
 import com.ruoyi.equipmentenergyconsumption.pojo.EquipmentEnergyConsumption;
 import com.ruoyi.equipmentenergyconsumption.service.EquipmentEnergyConsumptionService;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.common.constant.HttpStatus;
+import com.ruoyi.framework.web.domain.R;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -41,18 +42,18 @@
     }
 
     @Override
-    public AjaxResult importData(MultipartFile file) {
+    public R<?> importData(MultipartFile file) {
         try {
             ExcelUtil<EquipmentEnergyConsumption> util = new ExcelUtil<EquipmentEnergyConsumption>(EquipmentEnergyConsumption.class);
             List<EquipmentEnergyConsumption> userList = util.importExcel(file.getInputStream());
             if(CollectionUtils.isEmpty(userList)){
-                return AjaxResult.warn("妯℃澘閿欒鎴栧鍏ユ暟鎹负绌�");
+                return R.fail(HttpStatus.WARN, "妯℃澘閿欒鎴栧鍏ユ暟鎹负绌�");
             }
             this.saveOrUpdateBatch(userList);
-            return AjaxResult.success(true);
+            return R.ok(true);
         }catch (Exception e){
             e.printStackTrace();
-            return AjaxResult.error("瀵煎叆澶辫触");
+            return R.fail("瀵煎叆澶辫触");
         }
     }
 
diff --git a/src/main/java/com/ruoyi/framework/web/controller/BaseController.java b/src/main/java/com/ruoyi/framework/web/controller/BaseController.java
index 5c6fe3e..3edde93 100644
--- a/src/main/java/com/ruoyi/framework/web/controller/BaseController.java
+++ b/src/main/java/com/ruoyi/framework/web/controller/BaseController.java
@@ -16,7 +16,7 @@
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.sql.SqlUtil;
 import com.ruoyi.framework.security.LoginUser;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.framework.web.page.PageDomain;
 import com.ruoyi.framework.web.page.TableDataInfo;
 import com.ruoyi.framework.web.page.TableSupport;
@@ -93,69 +93,69 @@
     /**
      * 杩斿洖鎴愬姛
      */
-    public AjaxResult success()
+    public R<?> success()
     {
-        return AjaxResult.success();
+        return R.ok();
     }
 
     /**
      * 杩斿洖鎴愬姛娑堟伅
      */
-    public AjaxResult success(String message)
+    public R<?> success(String message)
     {
-        return AjaxResult.success(message);
+        return R.ok(null, message);
     }
 
     /**
      * 杩斿洖鎴愬姛娑堟伅
      */
-    public AjaxResult success(Object data)
+    public R<?> success(Object data)
     {
-        return AjaxResult.success(data);
+        return R.ok(data);
     }
 
     /**
      * 杩斿洖澶辫触娑堟伅
      */
-    public AjaxResult error()
+    public R<?> error()
     {
-        return AjaxResult.error();
+        return R.fail();
     }
 
     /**
      * 杩斿洖澶辫触娑堟伅
      */
-    public AjaxResult error(String message)
+    public R<?> error(String message)
     {
-        return AjaxResult.error(message);
+        return R.fail(message);
     }
 
     /**
      * 杩斿洖璀﹀憡娑堟伅
      */
-    public AjaxResult warn(String message)
+    public R<?> warn(String message)
     {
-        return AjaxResult.warn(message);
+        return R.fail(HttpStatus.WARN, message);
     }
 
     /**
      * 鍝嶅簲杩斿洖缁撴灉
-     * 
+     *
      * @param rows 褰卞搷琛屾暟
      * @return 鎿嶄綔缁撴灉
      */
-    protected AjaxResult toAjax(int rows)
+    protected R<?> toAjax(int rows)
     {
-        return rows > 0 ? AjaxResult.success() : AjaxResult.error();
+        return rows > 0 ? R.ok() : R.fail();
     }
 
     /**
      * 鍝嶅簲杩斿洖缁撴灉
-     * 
+     *
      * @param result 缁撴灉
      * @return 鎿嶄綔缁撴灉
      */
-    protected AjaxResult toAjax(boolean result)
+    protected R<?> toAjax(boolean result)
     {
         return result ? success() : error();
     }
diff --git a/src/main/java/com/ruoyi/home/controller/HomeController.java b/src/main/java/com/ruoyi/home/controller/HomeController.java
index 41ae224..9bd23f6 100644
--- a/src/main/java/com/ruoyi/home/controller/HomeController.java
+++ b/src/main/java/com/ruoyi/home/controller/HomeController.java
@@ -1,14 +1,21 @@
 package com.ruoyi.home.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ruoyi.approve.pojo.ApproveProcess;
+import com.ruoyi.device.mapper.DeviceLedgerMapper;
+import com.ruoyi.device.mapper.DeviceRepairMapper;
+import com.ruoyi.device.pojo.DeviceRepair;
 import com.ruoyi.dto.MapDto;
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.home.annotation.DefaultType;
 import com.ruoyi.home.dto.*;
 import com.ruoyi.home.service.HomeService;
+import com.ruoyi.production.mapper.ProductionOrderMapper;
+import com.ruoyi.production.mapper.ProductionProductOutputMapper;
+import com.ruoyi.production.pojo.ProductionOrder;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.AllArgsConstructor;
@@ -17,9 +24,20 @@
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.ParseException;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 /**
  * @author :yys
@@ -32,293 +50,698 @@
 public class HomeController extends BaseController {
 
     private final HomeService homeService;
+    private final ProductionOrderMapper productionOrderMapper;
+    private final ProductionProductOutputMapper productionProductOutputMapper;
+    private final DeviceLedgerMapper deviceLedgerMapper;
+    private final DeviceRepairMapper deviceRepairMapper;
+
+    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+    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_PAUSED = 4;
 
     /********************************************************鍩虹绫�*****************************************************/
     @GetMapping("/todos")
     @Log(title = "寰呭姙浜嬮」", businessType = BusinessType.OTHER)
     @Operation(summary = "寰呭姙浜嬮」")
-    public AjaxResult todos(ApproveProcess req) throws ParseException {
+    public R todos() throws ParseException {
         List<ApproveProcess> approveProcessList = homeService.todos();
-        return AjaxResult.success(approveProcessList);
+        return R.ok(approveProcessList);
     }
 
     @GetMapping("/approveAndDeviceTodos")
     @Operation(summary = "瀹℃壒鍗忓悓锛岃澶囨姤淇緟鍔炰簨椤�")
-    public AjaxResult approveAndDeviceTodos(){
+    public R approveAndDeviceTodos(){
         Map<String, Object> map = homeService.approveAndDeviceTodos();
-        return AjaxResult.success(map);
+        return R.ok(map);
     }
 
     @GetMapping("/noticesCount")
     @Operation(summary = "鏈繃鏈熺殑鍏憡鏁伴噺")
-    public AjaxResult noticesCount(){
+    public R noticesCount(){
         Long count = homeService.noticesCount();
-        return AjaxResult.success(count);
+        return R.ok(count);
     }
 
     @GetMapping("/deptStaffDistribution")
     @Operation(summary = "鍚勯儴闂ㄤ汉鍛樺垎甯�")
-    public AjaxResult deptStaffDistribution() {
+    public R deptStaffDistribution() {
         DeptStaffDistributionDto dto = homeService.deptStaffDistribution();
-        return AjaxResult.success(dto);
+        return R.ok(dto);
     }
 
     @GetMapping("/summaryStatistics")
     @Operation(summary = "鍛樺伐-瀹㈡埛-渚涘簲鍟嗘�绘暟")
-    public AjaxResult summaryStatistics() {
+    public R summaryStatistics() {
         HomeSummaryDto homeSummaryDto = homeService.summaryStatistics();
-        return AjaxResult.success(homeSummaryDto);
+        return R.ok(homeSummaryDto);
     }
 
     /********************************************************钀ラ攢閲囪喘绫�**************************************************/
     @GetMapping("/supplierPurchaseRanking")
     @Operation(summary = "渚涘簲鍟嗛噰璐帓鍚�")
-    public AjaxResult supplierPurchaseRanking(@DefaultType Integer type) {
+    public R supplierPurchaseRanking(@DefaultType Integer type) {
         List<SupplierPurchaseRankingDto> list = homeService.supplierPurchaseRanking(type);
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
 
     @GetMapping("/customerRevenueAnalysis")
     @Operation(summary = "瀹㈡埛钀ユ敹璐$尞鏁板�煎垎鏋�")
-    public AjaxResult customerRevenueAnalysis(Long customerId, @DefaultType Integer type) {
+    public R customerRevenueAnalysis(Long customerId, @DefaultType Integer type) {
         CustomerRevenueAnalysisDto dto = homeService.customerRevenueAnalysis(customerId, type);
-        return AjaxResult.success(dto);
+        return R.ok(dto);
     }
 
     @GetMapping("/customerContributionRanking")
     @Operation(summary = "瀹㈡埛閲戦璐$尞鎺掑悕")
-    public AjaxResult customerContributionRanking(@DefaultType Integer type) {
+    public R customerContributionRanking(@DefaultType Integer type) {
         List<CustomerContributionRankingDto> list = homeService.customerContributionRanking(type);
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
 
     @GetMapping("/productSalesAnalysis")
     @Operation(summary = "鍚勪骇鍝侀攢鍞噾棰濆垎鏋�")
-    public AjaxResult productSalesAnalysis() {
+    public R productSalesAnalysis() {
         List<MapDto> list = homeService.productSalesAnalysis();
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
 
     @GetMapping("/rawMaterialPurchaseAmountRatio")
     @Operation(summary = "鍘熸潗鏂欓噰璐噾棰濆崰姣�")
-    public AjaxResult rawMaterialPurchaseAmountRatio(){
+    public R rawMaterialPurchaseAmountRatio(){
         List<MapDto> list = homeService.rawMaterialPurchaseAmountRatio();
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
 
     @GetMapping("/business")
     @Log(title = "閿�鍞�-閲囪喘-搴撳瓨鏁版嵁", businessType = BusinessType.OTHER)
     @Operation(summary = "閿�鍞�-閲囪喘-搴撳瓨鏁版嵁")
-    public AjaxResult business(HomeBusinessDto req) {
+    public R business() {
         HomeBusinessDto homeBusinessDto = homeService.business();
-        return AjaxResult.success(homeBusinessDto);
+        return R.ok(homeBusinessDto);
     }
 
     @GetMapping("/analysisCustomerContractAmounts")
     @Log(title = "瀹㈡埛鍚堝悓閲戦鍒嗘瀽", businessType = BusinessType.OTHER)
     @Operation(summary = "瀹㈡埛鍚堝悓閲戦鍒嗘瀽")
-    public AjaxResult analysisCustomerContractAmounts(AnalysisCustomerContractAmountsDto req) {
+    public R analysisCustomerContractAmounts() {
         AnalysisCustomerContractAmountsDto analysisCustomerContractAmounts = homeService.analysisCustomerContractAmounts();
-        return AjaxResult.success(analysisCustomerContractAmounts);
+        return R.ok(analysisCustomerContractAmounts);
     }
 
     /********************************************************鐢熶骇绫�*****************************************************/
     @GetMapping("/inputOutputAnalysis")
     @Operation(summary = "鎶曞叆浜у嚭鍒嗘瀽")
-    public AjaxResult inputOutputAnalysis(@DefaultType Integer type){
+    public R inputOutputAnalysis(@DefaultType Integer type){
       List<InputOutputAnalysisDto> list = homeService.inputOutputAnalysis(type);
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
 
     @GetMapping("/processOutputAnalysis")
     @Operation(summary = "宸ュ簭浜у嚭鍒嗘瀽")
-    public AjaxResult processOutputAnalysis(@DefaultType Integer type){
+    public R processOutputAnalysis(@DefaultType Integer type){
         List<MapDto> list = homeService.processOutputAnalysis(type);
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
 
     @GetMapping("/workOrderEfficiencyAnalysis")
     @Operation(summary = "宸ュ崟鎵ц鏁堢巼鍒嗘瀽")
-    public AjaxResult workOrderEfficiencyAnalysis(@DefaultType Integer type){
+    public R workOrderEfficiencyAnalysis(@DefaultType Integer type){
         List<WorkOrderEfficiencyDto> list = homeService.workOrderEfficiencyAnalysis(type);
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
 
     @GetMapping("/productionAccountingAnalysis")
     @Operation(summary = "鐢熶骇鏍哥畻鍒嗘瀽")
-    public AjaxResult productionAccountingAnalysis(@DefaultType Integer type){
+    public R productionAccountingAnalysis(@DefaultType Integer type){
         List<ProductionAccountingDto> list   = homeService.productionAccountingAnalysis(type);
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
 
     @GetMapping("/orderCount")
     @Operation(summary = "璁㈠崟鏁�")
-    public AjaxResult orderCount(){
-        return AjaxResult.success(homeService.orderCount());
+    public R orderCount(){
+        return R.ok(homeService.orderCount());
     }
 
     @GetMapping("/progressStatistics")
     @Operation(summary = "鍚勭敓浜ц鍗曠殑瀹屾垚杩涘害缁熻")
-    public AjaxResult progressStatistics(){
+    public R progressStatistics(){
         ProductionProgressDto productionProgressDto = homeService.productionProgress();
-        return AjaxResult.success(productionProgressDto);
+        return R.ok(productionProgressDto);
     }
 
     @GetMapping("/workInProcessTurnover")
     @Operation(summary = "鍦ㄥ埗鍝佸懆杞儏鍐�")
-    public AjaxResult workInProcessTurnover(){
+    public R workInProcessTurnover(){
         ProductionTurnoverDto productionTurnoverDto = homeService.workInProcessTurnover();
-        return AjaxResult.success(productionTurnoverDto);
+        return R.ok(productionTurnoverDto);
     }
 
     @GetMapping("/processDataProductionStatistics")
     @Operation(summary = "宸ュ簭鏁版嵁鐢熶骇缁熻鏁版嵁")
-    public AjaxResult processDataProductionStatistics(@DefaultType Integer type,@RequestParam(required = false) List<Long> processIds) {
+    public R processDataProductionStatistics(@DefaultType Integer type,@RequestParam(required = false) List<Long> processIds) {
         List<processDataProductionStatisticsDto> list = homeService.processDataProductionStatistics(type, processIds);
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
 
     /********************************************************璐ㄩ噺绫�*****************************************************/
+    @GetMapping("/productionOverview")
+    @Operation(summary = "Production Overview")
+    public R productionOverview() {
+        LocalDate today = LocalDate.now();
+        Map<String, BigDecimal> totalStats = loadOutputStats(LocalDate.of(2000, 1, 1), today.plusDays(1));
+        BigDecimal totalOutput = totalStats.get("quantity");
+        BigDecimal totalScrap = totalStats.get("scrapQty");
+        BigDecimal yieldRate = calcRate(totalOutput, totalOutput.add(totalScrap));
+
+        Map<String, Object> result = new LinkedHashMap<>();
+        result.put("totalOutput", scale(totalOutput));
+        result.put("totalScrap", scale(totalScrap));
+        result.put("yieldRate", scale(yieldRate));
+        return R.ok(result);
+    }
+
+    @GetMapping("/productionRealtimeBoard")
+    @Operation(summary = "Production Realtime Board")
+    public R productionRealtimeBoard() {
+        LocalDate today = LocalDate.now();
+        LocalDate yesterday = today.minusDays(1);
+
+        BigDecimal todayDeviceOee = calcDeviceOee(today);
+        BigDecimal yesterdayDeviceOee = calcDeviceOee(yesterday);
+
+        BigDecimal todayOrderAchievementRate = calcOrderAchievementRate(today);
+        BigDecimal yesterdayOrderAchievementRate = calcOrderAchievementRate(yesterday);
+
+        BigDecimal todayDefectRate = calcDefectRate(today);
+        BigDecimal yesterdayDefectRate = calcDefectRate(yesterday);
+
+        Map<String, Object> result = new LinkedHashMap<>();
+        result.put("deviceOee", buildRealtimeMetric(todayDeviceOee, todayDeviceOee.subtract(yesterdayDeviceOee)));
+        result.put("orderAchievementRate", buildRealtimeMetric(todayOrderAchievementRate, todayOrderAchievementRate.subtract(yesterdayOrderAchievementRate)));
+        result.put("defectRate", buildRealtimeMetric(todayDefectRate, todayDefectRate.subtract(yesterdayDefectRate)));
+        return R.ok(result);
+    }
+
+    @GetMapping("/productionOrderProgress")
+    @Operation(summary = "Production Order Progress")
+    public R productionOrderProgress(@RequestParam(defaultValue = "all") String tab,
+                                     @RequestParam(required = false) String status,
+                                     @RequestParam(required = false) String bizDate,
+                                     @RequestParam(defaultValue = "1") Long pageNum,
+                                     @RequestParam(defaultValue = "10") Long pageSize) {
+        LocalDate queryDate = parseDateOrNull(bizDate);
+        if (!isBlank(bizDate) && queryDate == null) {
+            return R.fail("bizDate鏍煎紡閿欒锛岃浣跨敤yyyy-MM-dd");
+        }
+        Integer statusFromParam = parseOrderStatus(status);
+        if (!isBlank(status) && statusFromParam == null && !"all".equalsIgnoreCase(status.trim())) {
+            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;
+        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();
+
+        List<Map<String, Object>> rawRows = productionOrderMapper.selectHomeOrderProgressPage(queryStatus, offset, safePageSize, startTime, endTime);
+        List<Map<String, Object>> records = new ArrayList<>();
+        if (rawRows != null) {
+            for (Map<String, Object> rawRow : rawRows) {
+                records.add(buildOrderProgressRow(rawRow));
+            }
+        }
+
+        long waitingCount = 0L;
+        long inProgressCount = 0L;
+        long completedCount = 0L;
+        long pausedCount = 0L;
+        List<Map<String, Object>> statusCountRows = productionOrderMapper.countHomeOrderProgressByStatus(startTime, endTime);
+        if (statusCountRows != null) {
+            for (Map<String, Object> countRow : statusCountRows) {
+                Integer statusKey = toInteger(countRow.get("status"));
+                long cnt = toLong(countRow.get("cnt"));
+                if (Objects.equals(statusKey, ORDER_STATUS_WAIT)) {
+                    waitingCount = cnt;
+                } else if (Objects.equals(statusKey, ORDER_STATUS_RUNNING)) {
+                    inProgressCount = cnt;
+                } else if (Objects.equals(statusKey, ORDER_STATUS_COMPLETED)) {
+                    completedCount = cnt;
+                } else if (Objects.equals(statusKey, ORDER_STATUS_PAUSED)) {
+                    pausedCount = cnt;
+                }
+            }
+        }
+
+        Map<String, Object> result = new LinkedHashMap<>();
+        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(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("pausedCount", pausedCount);
+        result.put("records", records);
+        return R.ok(result);
+    }
+
+    @GetMapping("/todayProductionPlan")
+    @Operation(summary = "Today Production Plan")
+    public R todayProductionPlan(@RequestParam(defaultValue = "4") Long limit,
+                                 @RequestParam(required = false) String planDate) {
+        LocalDate queryDate = parseDateOrNull(planDate);
+        if (!isBlank(planDate) && queryDate == null) {
+            return R.fail("planDate鏍煎紡閿欒锛岃浣跨敤yyyy-MM-dd");
+        }
+
+        long safeLimit = limit == null || limit < 1 ? 4 : Math.min(limit, 20);
+        LocalDateTime planStart = queryDate == null ? null : queryDate.atStartOfDay();
+        LocalDateTime planEnd = queryDate == null ? null : queryDate.plusDays(1).atStartOfDay();
+        List<Map<String, Object>> records = new ArrayList<>();
+        List<Map<String, Object>> rawRows = productionOrderMapper.selectHomeTodayProductionPlan(safeLimit, planStart, planEnd);
+        if (rawRows != null) {
+            for (Map<String, Object> rawRow : rawRows) {
+                Map<String, Object> row = new LinkedHashMap<>();
+                Integer rowStatus = toInteger(rawRow.get("status"));
+                row.put("orderNo", rawRow.get("orderNo"));
+                row.put("productName", rawRow.get("productName"));
+                row.put("plannedQuantity", scale(toBigDecimal(rawRow.get("plannedQuantity"))));
+                row.put("dueDate", rawRow.get("dueDate"));
+                row.put("status", rowStatus);
+                row.put("statusLabel", mapOrderStatusLabel(rowStatus));
+                records.add(row);
+            }
+        }
+
+        Map<String, Object> result = new LinkedHashMap<>();
+        result.put("planDate", queryDate == null ? null : queryDate.format(DATE_FORMATTER));
+        result.put("total", toLong(productionOrderMapper.countHomeTodayProductionPlan(planStart, planEnd)));
+        result.put("records", records);
+        return R.ok(result);
+    }
+
     @GetMapping("/rawMaterialDetection")
     @Operation(summary = "鍘熸潗鏂欐娴�")
-    public AjaxResult rawMaterialDetection(@DefaultType Integer type){
-        return AjaxResult.success(homeService.rawMaterialDetection(type));
+    public R rawMaterialDetection(@DefaultType Integer type){
+        return R.ok(homeService.rawMaterialDetection(type));
     }
 
     @GetMapping("/processDetection")
     @Operation(summary = "杩囩▼妫�娴�")
-    public AjaxResult processDetection(@DefaultType Integer type){
-        return AjaxResult.success(homeService.processDetection(type));
+    public R processDetection(@DefaultType Integer type){
+        return R.ok(homeService.processDetection(type));
     }
 
     @GetMapping("/factoryDetection")
     @Operation(summary = "鎴愬搧鍑哄巶妫�娴�")
-    public AjaxResult factoryDetection(@DefaultType Integer type){
-        return AjaxResult.success(homeService.factoryDetection(type));
+    public R factoryDetection(@DefaultType Integer type){
+        return R.ok(homeService.factoryDetection(type));
     }
 
     @GetMapping("/qualityInspectionCount")
     @Operation(summary = "璐ㄩ噺妫�楠屾暟閲�")
-    public AjaxResult qualityInspectionCount(){
+    public R qualityInspectionCount(){
         QualityInspectionCountDto qualityInspectionCountDto = homeService.qualityInspectionCount();
-        return AjaxResult.success(qualityInspectionCountDto);
+        return R.ok(qualityInspectionCountDto);
     }
 
     @GetMapping("/nonComplianceWarning")
     @Operation(summary = "涓嶅悎鏍奸璀�")
-    public AjaxResult nonComplianceWarning(){
+    public R nonComplianceWarning(){
         NonComplianceWarningDto nonComplianceWarningDto = homeService.nonComplianceWarning();
-        return AjaxResult.success(nonComplianceWarningDto);
+        return R.ok(nonComplianceWarningDto);
     }
 
     @GetMapping("/completedInspectionCount")
     @Operation(summary = "瀹屾垚妫�楠屾暟")
-    public AjaxResult completedInspectionCount(){
+    public R completedInspectionCount(){
         List<CompletedInspectionCountDto> list = homeService.completedInspectionCount();
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
 
     @GetMapping("/unqualifiedProductRanking")
     @Operation(summary = "涓嶅悎鏍间骇鍝佹帓鍚�")
-    public AjaxResult unqualifiedProductRanking(){
+    public R unqualifiedProductRanking(){
         List<UnqualifiedProductRankDto> list = homeService.unqualifiedProductRanking();
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
 
     @GetMapping("/unqualifiedProductProcessingAnalysis")
     @Operation(summary = "涓嶅悎鏍兼鍝佸鐞嗗垎鏋�")
-    public AjaxResult unqualifiedProductProcessingAnalysis(){
+    public R unqualifiedProductProcessingAnalysis(){
         List<MapDto> list = homeService.unqualifiedProductProcessingAnalysis();
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
 
     @GetMapping("/qualityStatistics")
     @Log(title = "璐ㄩ噺鍒嗘瀽", businessType = BusinessType.OTHER)
     @Operation(summary = "璐ㄩ噺鍒嗘瀽")
-    public AjaxResult qualityStatistics(QualityStatisticsDto req) {
+    public R qualityStatistics() {
         QualityStatisticsDto qualityStatisticsDto = homeService.qualityStatistics();
-        return AjaxResult.success(qualityStatisticsDto);
+        return R.ok(qualityStatisticsDto);
     }
 
     @GetMapping("/qualityInspectionStatistics")
     @Operation(summary = "璐ㄩ噺缁熻")
-    public AjaxResult qualityInspectionStatistics(@DefaultType Integer type) {
+    public R qualityInspectionStatistics(@DefaultType Integer type) {
        QualityStatisticsDto  dto = homeService.qualityInspectionStatistics(type);
-        return AjaxResult.success(dto);
+        return R.ok(dto);
     }
 
     /********************************************************璐㈠姟绫�*****************************************************/
     @GetMapping("/incomeExpenseAnalysis")
     @Operation(summary = "鏀敹瀵规瘮鍒嗘瀽")
-    public AjaxResult incomeExpenseAnalysis(@DefaultType Integer type) {
+    public R incomeExpenseAnalysis(@DefaultType Integer type) {
         List<Map<String, Object>> result = homeService.incomeExpenseAnalysis(type);
-        return AjaxResult.success(result);
+        return R.ok(result);
     }
 
     @GetMapping("/profitTrendAnalysis")
     @Operation(summary = "鍒╂鼎瓒嬪娍鍒嗘瀽")
-    public AjaxResult profitTrendAnalysis(){
+    public R profitTrendAnalysis(){
         List<MapDto> list = homeService.profitTrendAnalysis();
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
 
     @GetMapping("/expenseCompositionAnalysis")
     @Operation(summary = "鏋勬垚鍒嗘瀽")
-    public AjaxResult expenseCompositionAnalysis(@DefaultType Integer type) {
+    public R expenseCompositionAnalysis(@DefaultType Integer type) {
         List<MapDto> list = homeService.expenseCompositionAnalysis(type);
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
 
     @GetMapping("/monthlyIncome")
     @Operation(summary = "鏈堝害鏀跺叆")
-    public AjaxResult monthlyIncome(){
+    public R monthlyIncome(){
         MonthlyIncomeDto dto = homeService.monthlyIncome();
-        return AjaxResult.success(dto);
+        return R.ok(dto);
     }
 
     @GetMapping("/monthlyExpenditure")
     @Operation(summary = "鏈堝害鏀嚭")
-    public AjaxResult monthlyExpenditure(){
+    public R monthlyExpenditure(){
         MonthlyExpenditureDto dto = homeService.monthlyExpenditure();
-        return AjaxResult.success(dto);
+        return R.ok(dto);
     }
 
     @GetMapping("/statisticsReceivablePayable")
     @Log(title = "搴旀敹搴斾粯缁熻", businessType = BusinessType.OTHER)
     @Operation(summary = "搴旀敹搴斾粯缁熻")
-    public AjaxResult statisticsReceivablePayable(StatisticsReceivablePayableDto req, @DefaultType Integer type ) {
+    public R statisticsReceivablePayable(@DefaultType Integer type ) {
         StatisticsReceivablePayableDto statisticsReceivablePayable = homeService.statisticsReceivablePayable(type);
-        return AjaxResult.success(statisticsReceivablePayable);
+        return R.ok(statisticsReceivablePayable);
     }
 
     /********************************************************浠撳偍绫�*****************************************************/
 
     @GetMapping("/productCategoryDistribution")
     @Operation(summary = "浜у搧澶х被鍒嗗竷")
-    public AjaxResult productCategoryDistribution() {
+    public R productCategoryDistribution() {
         ProductCategoryDistributionDto dto = homeService.productCategoryDistribution();
-        return AjaxResult.success(dto);
+        return R.ok(dto);
     }
 
     @GetMapping("/salesPurchaseStorageProductCount")
     @Operation(summary = "閿�鍞�-閲囪喘-鍌ㄥ瓨浜у搧鏁�")
-    public AjaxResult salesPurchaseStorageProductCount(){
+    public R salesPurchaseStorageProductCount(){
         List<MapDto> list = homeService.salesPurchaseStorageProductCount();
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
 
     @GetMapping("/productInOutAnalysis")
     @Operation(summary = "浜у搧鍑哄叆搴撳垎鏋�")
-    public AjaxResult productInOutAnalysis(@DefaultType Integer type){
+    public R productInOutAnalysis(@DefaultType Integer type){
         List<Map<String, Object>> result = homeService.productInOutAnalysis(type);
-        return AjaxResult.success(result);
+        return R.ok(result);
     }
 
     @GetMapping("/productTurnoverDays")
     @Operation(summary = "浜у搧鍛ㄨ浆澶╂暟")
-    public AjaxResult productTurnoverDays(){
+    public R productTurnoverDays(){
         List<MapDto> list = homeService.productTurnoverDays();
-        return AjaxResult.success(list);
+        return R.ok(list);
+    }
+
+    private Map<String, Object> buildOrderProgressRow(Map<String, Object> rawRow) {
+        Map<String, Object> row = new LinkedHashMap<>();
+        Integer rowStatus = toInteger(rawRow.get("status"));
+        row.put("orderNo", rawRow.get("orderNo"));
+        row.put("productName", rawRow.get("productName"));
+        row.put("plannedQuantity", scale(toBigDecimal(rawRow.get("plannedQuantity"))));
+        row.put("completedQuantity", scale(toBigDecimal(rawRow.get("completedQuantity"))));
+        row.put("completionRate", scale(toBigDecimal(rawRow.get("completionRate"))));
+        row.put("dueDate", rawRow.get("dueDate"));
+        row.put("status", rowStatus);
+        row.put("statusLabel", mapOrderStatusLabel(rowStatus));
+        return row;
+    }
+
+    private Integer resolveOrderStatus(String status, String tab) {
+        if (!isBlank(status)) {
+            return parseOrderStatus(status);
+        }
+        return parseOrderStatus(tab);
+    }
+
+    private Integer parseOrderStatus(String rawStatus) {
+        if (isBlank(rawStatus)) {
+            return null;
+        }
+        String normalized = rawStatus.trim().toLowerCase();
+        if ("all".equals(normalized)) {
+            return null;
+        }
+        if ("1".equals(normalized) || "waiting".equals(normalized) || "wait".equals(normalized)) {
+            return ORDER_STATUS_WAIT;
+        }
+        if ("2".equals(normalized) || "inprogress".equals(normalized) || "running".equals(normalized)) {
+            return ORDER_STATUS_RUNNING;
+        }
+        if ("3".equals(normalized) || "completed".equals(normalized)) {
+            return ORDER_STATUS_COMPLETED;
+        }
+        if ("4".equals(normalized) || "paused".equals(normalized)) {
+            return ORDER_STATUS_PAUSED;
+        }
+        return null;
+    }
+
+    private String mapOrderTab(Integer status) {
+        if (Objects.equals(status, ORDER_STATUS_RUNNING)) {
+            return "inProgress";
+        }
+        if (Objects.equals(status, ORDER_STATUS_COMPLETED)) {
+            return "completed";
+        }
+        if (Objects.equals(status, ORDER_STATUS_PAUSED)) {
+            return "paused";
+        }
+        if (Objects.equals(status, ORDER_STATUS_WAIT)) {
+            return "waiting";
+        }
+        return "all";
+    }
+
+    private String mapOrderStatus(Integer status) {
+        if (Objects.equals(status, ORDER_STATUS_WAIT)) {
+            return "waiting";
+        }
+        if (Objects.equals(status, ORDER_STATUS_RUNNING)) {
+            return "inProgress";
+        }
+        if (Objects.equals(status, ORDER_STATUS_COMPLETED)) {
+            return "completed";
+        }
+        if (Objects.equals(status, ORDER_STATUS_PAUSED)) {
+            return "paused";
+        }
+        return "all";
+    }
+
+    private String mapOrderStatusLabel(Integer status) {
+        if (Objects.equals(status, ORDER_STATUS_WAIT)) {
+            return "寰呭紑濮�";
+        }
+        if (Objects.equals(status, ORDER_STATUS_RUNNING)) {
+            return "杩涜涓�";
+        }
+        if (Objects.equals(status, ORDER_STATUS_COMPLETED)) {
+            return "宸插畬鎴�";
+        }
+        if (Objects.equals(status, ORDER_STATUS_PAUSED)) {
+            return "宸叉殏鍋�";
+        }
+        return "鏈煡";
+    }
+
+    private Map<String, BigDecimal> loadOutputStats(LocalDate startDate, LocalDate endDateExclusive) {
+        String start = startDate.atStartOfDay().format(DATE_TIME_FORMATTER);
+        String end = endDateExclusive.atStartOfDay().format(DATE_TIME_FORMATTER);
+
+        BigDecimal quantity = BigDecimal.ZERO;
+        BigDecimal scrapQty = BigDecimal.ZERO;
+        List<Map<String, Object>> rows = productionProductOutputMapper.selectDailyOutputStats(start, end);
+        if (rows != null) {
+            for (Map<String, Object> row : rows) {
+                quantity = quantity.add(toBigDecimal(row.get("quantity")));
+                scrapQty = scrapQty.add(toBigDecimal(row.get("scrapQty")));
+            }
+        }
+
+        Map<String, BigDecimal> stats = new LinkedHashMap<>();
+        stats.put("quantity", quantity);
+        stats.put("scrapQty", scrapQty);
+        return stats;
+    }
+
+    private BigDecimal calcDeviceOee(LocalDate day) {
+        long totalDeviceCount = deviceLedgerMapper.selectCount(new LambdaQueryWrapper<>());
+        if (totalDeviceCount <= 0) {
+            return BigDecimal.ZERO;
+        }
+
+        Date start = Date.from(day.atStartOfDay(ZoneId.systemDefault()).toInstant());
+        Date end = Date.from(day.plusDays(1).atStartOfDay(ZoneId.systemDefault()).toInstant());
+
+        List<DeviceRepair> repairList = deviceRepairMapper.selectList(new LambdaQueryWrapper<DeviceRepair>()
+                .select(DeviceRepair::getDeviceLedgerId)
+                .ge(DeviceRepair::getRepairTime, start)
+                .lt(DeviceRepair::getRepairTime, end)
+                .in(DeviceRepair::getStatus, 0, 3));
+
+        long repairingDeviceCount = repairList == null ? 0 : repairList.stream()
+                .map(DeviceRepair::getDeviceLedgerId)
+                .filter(Objects::nonNull)
+                .distinct()
+                .count();
+
+        long availableDeviceCount = Math.max(totalDeviceCount - repairingDeviceCount, 0);
+        return new BigDecimal(availableDeviceCount)
+                .multiply(new BigDecimal("100"))
+                .divide(new BigDecimal(totalDeviceCount), 2, RoundingMode.HALF_UP);
+    }
+
+    private BigDecimal calcOrderAchievementRate(LocalDate day) {
+        List<ProductionOrder> orderList = productionOrderMapper.selectList(new LambdaQueryWrapper<ProductionOrder>()
+                .select(ProductionOrder::getQuantity, ProductionOrder::getCompleteQuantity)
+                .ge(ProductionOrder::getCreateTime, day.atStartOfDay())
+                .lt(ProductionOrder::getCreateTime, day.plusDays(1).atStartOfDay())
+                .ne(ProductionOrder::getStatus, ORDER_STATUS_PAUSED));
+
+        BigDecimal totalQuantity = BigDecimal.ZERO;
+        BigDecimal totalCompleteQuantity = BigDecimal.ZERO;
+        if (orderList != null) {
+            for (ProductionOrder order : orderList) {
+                totalQuantity = totalQuantity.add(zeroIfNull(order.getQuantity()));
+                totalCompleteQuantity = totalCompleteQuantity.add(zeroIfNull(order.getCompleteQuantity()));
+            }
+        }
+        return calcRate(totalCompleteQuantity, totalQuantity);
+    }
+
+    private BigDecimal calcDefectRate(LocalDate day) {
+        Map<String, BigDecimal> stats = loadOutputStats(day, day.plusDays(1));
+        BigDecimal quantity = stats.get("quantity");
+        BigDecimal scrapQty = stats.get("scrapQty");
+        return calcRate(scrapQty, quantity.add(scrapQty));
+    }
+
+    private Map<String, Object> buildRealtimeMetric(BigDecimal value, BigDecimal change) {
+        Map<String, Object> metric = new LinkedHashMap<>();
+        metric.put("value", scale(value));
+        metric.put("compareYesterday", scale(change));
+        return metric;
+    }
+
+    private BigDecimal calcRate(BigDecimal numerator, BigDecimal denominator) {
+        if (denominator == null || denominator.compareTo(BigDecimal.ZERO) <= 0) {
+            return BigDecimal.ZERO;
+        }
+        return zeroIfNull(numerator)
+                .multiply(new BigDecimal("100"))
+                .divide(denominator, 2, RoundingMode.HALF_UP);
+    }
+
+    private BigDecimal toBigDecimal(Object value) {
+        if (value == null) {
+            return BigDecimal.ZERO;
+        }
+        if (value instanceof BigDecimal) {
+            return (BigDecimal) value;
+        }
+        if (value instanceof Number) {
+            return BigDecimal.valueOf(((Number) value).doubleValue());
+        }
+        try {
+            return new BigDecimal(String.valueOf(value));
+        } catch (Exception ex) {
+            return BigDecimal.ZERO;
+        }
+    }
+
+    private Integer toInteger(Object value) {
+        if (value == null) {
+            return null;
+        }
+        if (value instanceof Integer) {
+            return (Integer) value;
+        }
+        if (value instanceof Number) {
+            return ((Number) value).intValue();
+        }
+        try {
+            return Integer.valueOf(String.valueOf(value));
+        } catch (Exception ex) {
+            return null;
+        }
+    }
+
+    private long toLong(Object value) {
+        if (value == null) {
+            return 0L;
+        }
+        if (value instanceof Long) {
+            return (Long) value;
+        }
+        if (value instanceof Number) {
+            return ((Number) value).longValue();
+        }
+        try {
+            return Long.parseLong(String.valueOf(value));
+        } catch (Exception ex) {
+            return 0L;
+        }
+    }
+
+    private LocalDate parseDateOrNull(String rawDate) {
+        if (isBlank(rawDate)) {
+            return null;
+        }
+        try {
+            return LocalDate.parse(rawDate.trim(), DATE_FORMATTER);
+        } catch (DateTimeParseException ex) {
+            return null;
+        }
+    }
+
+    private boolean isBlank(String value) {
+        return value == null || value.trim().isEmpty();
+    }
+
+    private BigDecimal zeroIfNull(BigDecimal value) {
+        return value == null ? BigDecimal.ZERO : value;
+    }
+
+    private BigDecimal scale(BigDecimal value) {
+        return zeroIfNull(value).setScale(2, RoundingMode.HALF_UP);
     }
 
 }
diff --git a/src/main/java/com/ruoyi/lavorissue/controller/LavorIssueController.java b/src/main/java/com/ruoyi/lavorissue/controller/LavorIssueController.java
index 9b4779e..d1f325f 100644
--- a/src/main/java/com/ruoyi/lavorissue/controller/LavorIssueController.java
+++ b/src/main/java/com/ruoyi/lavorissue/controller/LavorIssueController.java
@@ -11,7 +11,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.lavorissue.dto.StatisticsLaborIssue;
 import com.ruoyi.lavorissue.mapper.LavorIssueMapper;
 import com.ruoyi.lavorissue.pojo.LaborIssue;
@@ -52,24 +52,24 @@
     @GetMapping("/listPage")
     @Log(title = "鍔充繚鍙戞斁-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
     @Operation(summary = "鍔充繚鍙戞斁-鍒嗛〉鏌ヨ")
-    public AjaxResult listPage(Page page, LaborIssue laborIssue){
+    public R<?> listPage(Page page, LaborIssue laborIssue){
         IPage<LaborIssue> listPage = laborIssueService.listPage(page, laborIssue);
-        return AjaxResult.success(listPage);
+        return R.ok(listPage);
     }
 
     @GetMapping("/statisticsList")
     @Log(title = "鍔充繚鍙戞斁-缁熻鏌ヨ", businessType = BusinessType.OTHER)
     @Operation(summary = "鍔充繚鍙戞斁-缁熻鏌ヨ")
-    public AjaxResult statisticsList(LaborIssue laborIssue){
+    public R<?> statisticsList(LaborIssue laborIssue){
         List<Map<String, Object>> listPage = laborIssueService.statisticsList(laborIssue);
-        return AjaxResult.success(listPage);
+        return R.ok(listPage);
     }
 
     @PostMapping("/add")
     @Log(title = "鍔充繚鍙戞斁-娣诲姞", businessType = BusinessType.INSERT)
     @Operation(summary = "鍔充繚鍙戞斁-娣诲姞")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult add(@RequestBody LaborIssue laborIssue){
+    public R<?> add(@RequestBody LaborIssue laborIssue){
         String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
         StartAndEndDateDto dateTime = DailyRedisCounter.getDateTime();
         Long approveId = lavorIssueMapper.selectCount(new LambdaQueryWrapper<LaborIssue>()
@@ -84,32 +84,32 @@
             laborIssue.setOrderNo(String.format("%03d", l + 1));
         }
         boolean save = laborIssueService.save(laborIssue);
-        return save ? AjaxResult.success() : AjaxResult.error();
+        return save ? R.ok() : R.fail();
     }
 
     @PostMapping("/update")
     @Log(title = "鍔充繚鍙戞斁-淇敼", businessType = BusinessType.UPDATE)
     @Operation(summary = "鍔充繚鍙戞斁-淇敼")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult update(@RequestBody LaborIssue laborIssue){
+    public R<?> update(@RequestBody LaborIssue laborIssue){
         boolean update = laborIssueService.updateById(laborIssue);
-        return update ? AjaxResult.success() : AjaxResult.error();
+        return update ? R.ok() : R.fail();
     }
 
     @DeleteMapping("/delete")
     @Log(title = "鍔充繚鍙戞斁-鍒犻櫎", businessType = BusinessType.DELETE)
     @Operation(summary = "鍔充繚鍙戞斁-鍒犻櫎")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult delete(@RequestBody List<Long> ids){
+    public R<?> delete(@RequestBody List<Long> ids){
         boolean delete = laborIssueService.removeBatchByIds(ids);
-        return delete ? AjaxResult.success() : AjaxResult.error();
+        return delete ? R.ok() : R.fail();
     }
 
     @GetMapping("/statistics")
     @Operation(summary = "鍔充繚鍙戞斁-缁熻")
-    public AjaxResult statistics(StatisticsLaborIssue req) throws Exception {
+    public R<?> statistics(StatisticsLaborIssue req) throws Exception {
         StatisticsLaborIssue statisticsLaborIssue = laborIssueService.statistics(req);
-        return AjaxResult.success(statisticsLaborIssue);
+        return R.ok(statisticsLaborIssue);
     }
 
 
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/controller/MeasuringInstrumentLedgerController.java b/src/main/java/com/ruoyi/measuringinstrumentledger/controller/MeasuringInstrumentLedgerController.java
index e092741..1104c15 100644
--- a/src/main/java/com/ruoyi/measuringinstrumentledger/controller/MeasuringInstrumentLedgerController.java
+++ b/src/main/java/com/ruoyi/measuringinstrumentledger/controller/MeasuringInstrumentLedgerController.java
@@ -6,7 +6,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.measuringinstrumentledger.dto.MeasuringInstrumentLedgerDto;
 import com.ruoyi.measuringinstrumentledger.mapper.MeasuringInstrumentLedgerRecordMapper;
 import com.ruoyi.measuringinstrumentledger.pojo.MeasuringInstrumentLedger;
@@ -43,9 +43,9 @@
     @GetMapping("/listPage")
     @Operation(summary = "璁¢噺鍣ㄥ叿鍙拌处-鍒嗛〉鏌ヨ")
     @Log(title = "璁¢噺鍣ㄥ叿鍙拌处-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
-    public AjaxResult listPage(Page page, MeasuringInstrumentLedger measuringInstrumentLedger) {
+    public R<?> listPage(Page page, MeasuringInstrumentLedger measuringInstrumentLedger) {
         IPage<MeasuringInstrumentLedger> listPage = measuringInstrumentLedgerService.listPage(page, measuringInstrumentLedger);
-        return AjaxResult.success(listPage);
+        return R.ok(listPage);
     }
 
 
@@ -53,59 +53,59 @@
     @Operation(summary = "璁¢噺鍣ㄥ叿鍙拌处-鏂板")
     @Log(title = "璁¢噺鍣ㄥ叿鍙拌处-鏂板", businessType = BusinessType.INSERT)
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult add(@RequestBody MeasuringInstrumentLedger measuringInstrumentLedger) throws IOException {
+    public R<?> add(@RequestBody MeasuringInstrumentLedger measuringInstrumentLedger) throws IOException {
         boolean save = measuringInstrumentLedgerService.add(measuringInstrumentLedger);
         if (save) {
-            return AjaxResult.success();
+            return R.ok();
         }
-        return AjaxResult.error();
+        return R.fail();
     }
 
     @PostMapping("/update")
     @Operation(summary = "璁¢噺鍣ㄥ叿鍙拌处-淇敼")
     @Log(title = "璁¢噺鍣ㄥ叿鍙拌处-淇敼", businessType = BusinessType.UPDATE)
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult update(@RequestBody MeasuringInstrumentLedger measuringInstrumentLedger) {
+    public R<?> update(@RequestBody MeasuringInstrumentLedger measuringInstrumentLedger) {
         SysUser sysUser = sysUserMapper.selectUserById(measuringInstrumentLedger.getUserId());
         if (sysUser == null) {
-            return AjaxResult.error("鐢ㄦ埛涓嶅瓨鍦�");
+            return R.fail("鐢ㄦ埛涓嶅瓨鍦�");
         }
         measuringInstrumentLedger.setUserName(sysUser.getUserName());
         boolean update = measuringInstrumentLedgerService.updateById(measuringInstrumentLedger);
         if (update) {
-            return AjaxResult.success();
+            return R.ok();
         }
-        return AjaxResult.error();
+        return R.fail();
     }
 
     @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("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+    public R<?> delete(@RequestBody List<Long> ids) {
+        if(CollectionUtils.isEmpty(ids)) return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         for (Long id : ids) {
             LambdaQueryWrapper<MeasuringInstrumentLedgerRecord> queryWrapper = new LambdaQueryWrapper<>();
             queryWrapper.eq(MeasuringInstrumentLedgerRecord::getMeasuringInstrumentLedgerId,id);
             List<MeasuringInstrumentLedgerRecord> measuringInstrumentLedgerRecords = measuringInstrumentLedgerRecordMapper.selectList(queryWrapper);
             if(!CollectionUtils.isEmpty(measuringInstrumentLedgerRecords)){
-                return AjaxResult.error("璇峰厛鍒犻櫎閫変腑璁¢噺鍣ㄥ叿鍙拌处涓嬬殑鎵�鏈夋瀹氳褰�");
+                return R.fail("璇峰厛鍒犻櫎閫変腑璁¢噺鍣ㄥ叿鍙拌处涓嬬殑鎵�鏈夋瀹氳褰�");
             }
         }
         boolean delete = measuringInstrumentLedgerService.removeBatchByIds(ids);
         if (delete) {
-            return AjaxResult.success();
+            return R.ok();
         }
-        return AjaxResult.error();
+        return R.fail();
     }
 
     @PostMapping("/verifying")
     @Operation(summary = "璁¢噺鍣ㄥ叿鍙拌处-妫�瀹�")
     @Log(title = "璁¢噺鍣ㄥ叿鍙拌处-妫�瀹�", businessType = BusinessType.UPDATE)
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult verifying(@RequestBody MeasuringInstrumentLedgerDto measuringInstrumentLedger) throws IOException {
+    public R<?> verifying(@RequestBody MeasuringInstrumentLedgerDto measuringInstrumentLedger) throws IOException {
         boolean update = measuringInstrumentLedgerService.verifying(measuringInstrumentLedger);
-        return update ? AjaxResult.success("妫�瀹氭垚鍔�") : AjaxResult.error("妫�瀹氬け璐�");
+        return update ? R.ok(null, "妫�瀹氭垚鍔�") : R.fail("妫�瀹氬け璐�");
     }
 
     /**
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/controller/MeasuringInstrumentLedgerRecordController.java b/src/main/java/com/ruoyi/measuringinstrumentledger/controller/MeasuringInstrumentLedgerRecordController.java
index 370d41d..73e756b 100644
--- a/src/main/java/com/ruoyi/measuringinstrumentledger/controller/MeasuringInstrumentLedgerRecordController.java
+++ b/src/main/java/com/ruoyi/measuringinstrumentledger/controller/MeasuringInstrumentLedgerRecordController.java
@@ -5,7 +5,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.measuringinstrumentledger.pojo.MeasuringInstrumentLedgerRecord;
 import com.ruoyi.measuringinstrumentledger.service.MeasuringInstrumentLedgerRecordService;
 import io.jsonwebtoken.lang.Collections;
@@ -36,29 +36,29 @@
     @GetMapping("/listPage")
     @Operation(summary = "璁¢噺鍣ㄥ叿鍙拌处璁板綍-鍒嗛〉鏌ヨ")
     @Log(title = "璁¢噺鍣ㄥ叿鍙拌处璁板綍-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
-    public AjaxResult listPage(Page page, MeasuringInstrumentLedgerRecord measuringInstrumentLedgerRecord){
+    public R<?> listPage(Page page, MeasuringInstrumentLedgerRecord measuringInstrumentLedgerRecord){
         IPage<MeasuringInstrumentLedgerRecord> listPage = measuringInstrumentLedgerRecordService.listPage(page, measuringInstrumentLedgerRecord);
-        return AjaxResult.success(listPage);
+        return R.ok(listPage);
     }
 
     @PostMapping("/update")
     @Operation(summary = "璁¢噺鍣ㄥ叿鍙拌处璁板綍-淇敼")
     @Log(title = "璁¢噺鍣ㄥ叿鍙拌处璁板綍-淇敼", businessType = BusinessType.UPDATE)
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult update(@RequestBody MeasuringInstrumentLedgerRecord measuringInstrumentLedgerRecord) throws IOException {
+    public R<?> update(@RequestBody MeasuringInstrumentLedgerRecord measuringInstrumentLedgerRecord) throws IOException {
         boolean update = measuringInstrumentLedgerRecordService.updateMeasuringInstrumentLedgerRecord(measuringInstrumentLedgerRecord);
         if (update) {
-            return AjaxResult.success();
+            return R.ok();
         }
-        return AjaxResult.error();
+        return R.fail();
     }
 
     @DeleteMapping("/delete")
     @Operation(summary = "璁¢噺鍣ㄥ叿鍙拌处璁板綍-鍒犻櫎")
     @Log(title = "璁¢噺鍣ㄥ叿鍙拌处璁板綍-鍒犻櫎", businessType = BusinessType.DELETE)
-    public AjaxResult delete(@RequestBody List<Long> ids) {
-        if(Collections.isEmpty(ids)) return AjaxResult.error("璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁");
-        return AjaxResult.success(measuringInstrumentLedgerRecordService.removeBatchByIds(ids));
+    public R<?> delete(@RequestBody List<Long> ids) {
+        if(Collections.isEmpty(ids)) return R.fail("璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁");
+        return R.ok(measuringInstrumentLedgerRecordService.removeBatchByIds(ids));
     }
 
     /**
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsController.java b/src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsController.java
index 5a328c1..3d8336b 100644
--- a/src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsController.java
+++ b/src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsController.java
@@ -5,7 +5,8 @@
 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.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.measuringinstrumentledger.dto.SparePartsDto;
 import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
 import com.ruoyi.measuringinstrumentledger.service.SparePartsService;
@@ -21,19 +22,19 @@
 @RequestMapping("/spareParts")
 @Tag(name = "澶囦欢鍒嗙被鎺ュ彛")
 @AllArgsConstructor
-public class SparePartsController {
+public class SparePartsController extends BaseController {
     private SparePartsService sparePartsService;
     @GetMapping("/getTree")
     @Operation(summary = "澶囦欢鍒嗙被-鏍戠粨鏋�")
-    public AjaxResult getTree(){
+    public R<?> getTree(){
         List<SparePartsDto> tree = sparePartsService.getTree();
-        return AjaxResult.success(tree);
+        return R.ok(tree);
     }
     @GetMapping("/listPage")
     @Operation(summary = "澶囦欢鍒嗙被-鍒嗛〉鏌ヨ")
-    public AjaxResult listPage(Page page, SpareParts spareParts){
+    public R<?> listPage(Page page, SpareParts spareParts){
         IPage<SparePartsDto> listPage = sparePartsService.listPage(page, spareParts);
-        return AjaxResult.success(listPage);
+        return R.ok(listPage);
     }
 //    @GetMapping("/list")
 //    @Operation(summary = "澶囦欢鍒嗙被-鏌ヨ鎵�鏈�")
@@ -43,20 +44,20 @@
     @PostMapping("/add")
     @Operation(summary = "澶囦欢鍒嗙被-娣诲姞")
     @Log(title = "澶囦欢鍒嗙被-娣诲姞", businessType = BusinessType.INSERT)
-    public AjaxResult add(@RequestBody SpareParts spareParts){
-        return AjaxResult.success(sparePartsService.save(spareParts));
+    public R<?> add(@RequestBody SpareParts spareParts){
+        return R.ok(sparePartsService.save(spareParts));
     }
     @PostMapping("/update")
     @Operation(summary = "澶囦欢鍒嗙被-鏇存柊")
     @Log(title = "澶囦欢鍒嗙被-鏇存柊", businessType = BusinessType.UPDATE)
-    public AjaxResult update(@RequestBody SpareParts spareParts){
-        return AjaxResult.success(sparePartsService.updateById(spareParts));
+    public R<?> update(@RequestBody SpareParts spareParts){
+        return R.ok(sparePartsService.updateById(spareParts));
     }
     @DeleteMapping("/delete/{id}")
     @Operation(summary = "澶囦欢鍒嗙被-鍒犻櫎")
     @Log(title = "澶囦欢鍒嗙被-鍒犻櫎", businessType = BusinessType.DELETE)
-    public AjaxResult delete(@PathVariable Long id){
-        return AjaxResult.success(sparePartsService.removeById(id));
+    public R<?> delete(@PathVariable Long id){
+        return R.ok(sparePartsService.removeById(id));
     }
 
 }
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsRequisitionRecordController.java b/src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsRequisitionRecordController.java
index 26195a4..5c93a4d 100644
--- a/src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsRequisitionRecordController.java
+++ b/src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsRequisitionRecordController.java
@@ -2,7 +2,8 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.measuringinstrumentledger.dto.SparePartsRequisitionRecordDto;
 import com.ruoyi.measuringinstrumentledger.service.SparePartsRequisitionRecordService;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -24,13 +25,13 @@
 @RequestMapping("/sparePartsRequisitionRecord")
 @Tag(name = "澶囦欢棰嗙敤璁板綍鎺ュ彛")
 @AllArgsConstructor
-public class SparePartsRequisitionRecordController {
+public class SparePartsRequisitionRecordController extends BaseController {
     private SparePartsRequisitionRecordService sparePartsRequisitionRecordService;
 
     @GetMapping("/listPage")
     @Operation(summary = "澶囦欢鍒嗙被-鍒嗛〉鏌ヨ")
-    public AjaxResult listPage(Page page, SparePartsRequisitionRecordDto sparePartsRequisitionRecordDto){
+    public R<?> listPage(Page page, SparePartsRequisitionRecordDto sparePartsRequisitionRecordDto){
         IPage<SparePartsRequisitionRecordDto> listPage = sparePartsRequisitionRecordService.listPage(page, sparePartsRequisitionRecordDto);
-        return AjaxResult.success(listPage);
+        return R.ok(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..8347921 100644
--- a/src/main/java/com/ruoyi/officesupplies/controller/OfficeSuppliesController.java
+++ b/src/main/java/com/ruoyi/officesupplies/controller/OfficeSuppliesController.java
@@ -7,7 +7,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.officesupplies.pojo.OfficeSupplies;
 import com.ruoyi.officesupplies.service.OfficeSuppliesService;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -38,14 +38,14 @@
 
     @GetMapping("/listPage")
     @Operation(summary = "鍔炲叕鐗╄祫-鍒嗛〉鏌ヨ")
-    public AjaxResult listPage(Page page, OfficeSupplies officeSupplies) {
+    public R<?> listPage(Page page, OfficeSupplies officeSupplies) {
         return officeSuppliesService.listPage(page, officeSupplies);
     }
 
     @PostMapping("/add")
     @Operation(summary = "鍔炲叕鐗╄祫-娣诲姞")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult add(@RequestBody OfficeSupplies officeSupplies) {
+    public R<?> add(@RequestBody OfficeSupplies officeSupplies) {
         // 鎸夌収褰撳墠鏃堕棿yyyyMMdd + 褰撳ぉ鏂板鏁伴噺 + 1鐢熸垚缂栧彿
         // 鑾峰彇褰撳ぉ鏂板鏁伴噺
         long count = officeSuppliesService.count(new LambdaQueryWrapper<OfficeSupplies>()
@@ -55,22 +55,22 @@
         officeSupplies.setCode(code);
         officeSupplies.setStatus(1);
         officeSupplies.setApplyTime(new Date());
-        return officeSuppliesService.save(officeSupplies) ? success() : error();
+        return officeSuppliesService.save(officeSupplies) ? R.ok() : R.fail();
     }
 
     @PostMapping("/update")
     @Operation(summary = "鍔炲叕鐗╄祫-淇敼")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult update(@RequestBody OfficeSupplies officeSupplies) {
-        return officeSuppliesService.updateById(officeSupplies) ? success() : error();
+    public R<?> update(@RequestBody OfficeSupplies officeSupplies) {
+        return officeSuppliesService.updateById(officeSupplies) ? R.ok() : R.fail();
     }
 
     @DeleteMapping("/delete")
     @Operation(summary = "鍔炲叕鐗╄祫-鍒犻櫎")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult delete(@RequestBody List<Long> ids) {
-        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
-        return officeSuppliesService.removeBatchByIds(ids) ? success() : error();
+    public R<?> delete(@RequestBody List<Long> ids) {
+        if(CollectionUtils.isEmpty(ids)) return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        return officeSuppliesService.removeBatchByIds(ids) ? R.ok() : R.fail();
     }
 
     /**
diff --git a/src/main/java/com/ruoyi/officesupplies/service/OfficeSuppliesService.java b/src/main/java/com/ruoyi/officesupplies/service/OfficeSuppliesService.java
index 3a521b5..4f6f9ce 100644
--- a/src/main/java/com/ruoyi/officesupplies/service/OfficeSuppliesService.java
+++ b/src/main/java/com/ruoyi/officesupplies/service/OfficeSuppliesService.java
@@ -2,7 +2,7 @@
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.officesupplies.pojo.OfficeSupplies;
 
 /**
@@ -18,5 +18,5 @@
      * @param officeSupplies
      * @return
      */
-    AjaxResult listPage(Page page, OfficeSupplies officeSupplies);
+    R<?> listPage(Page page, OfficeSupplies officeSupplies);
 }
diff --git a/src/main/java/com/ruoyi/officesupplies/service/impl/OfficeSuppliesServiceImpl.java b/src/main/java/com/ruoyi/officesupplies/service/impl/OfficeSuppliesServiceImpl.java
index abdc1c7..f366b6c 100644
--- a/src/main/java/com/ruoyi/officesupplies/service/impl/OfficeSuppliesServiceImpl.java
+++ b/src/main/java/com/ruoyi/officesupplies/service/impl/OfficeSuppliesServiceImpl.java
@@ -3,7 +3,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.officesupplies.mapper.OfficeSuppliesMapper;
 import com.ruoyi.officesupplies.pojo.OfficeSupplies;
 import com.ruoyi.officesupplies.service.OfficeSuppliesService;
@@ -23,8 +23,8 @@
     private final OfficeSuppliesMapper officeSuppliesMapper;
 
     @Override
-    public AjaxResult listPage(Page page, OfficeSupplies officeSupplies) {
+    public R<?> listPage(Page page, OfficeSupplies officeSupplies) {
         IPage<OfficeSupplies> list = officeSuppliesMapper.listPage(page, officeSupplies);
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/GasTankWarningController.java b/src/main/java/com/ruoyi/procurementrecord/controller/GasTankWarningController.java
index ea214c2..135198f 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/GasTankWarningController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/GasTankWarningController.java
@@ -3,7 +3,8 @@
 
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.procurementrecord.pojo.GasTankWarning;
 import com.ruoyi.procurementrecord.service.GasTankWarningService;
 import jakarta.servlet.http.HttpServletResponse;
@@ -15,28 +16,28 @@
 @RestController
 @RequestMapping("/gasTankWarning")
 @AllArgsConstructor
-public class GasTankWarningController {
+public class GasTankWarningController extends BaseController {
     private GasTankWarningService gasTankWarningService;
 
     @GetMapping("/listPage")
-    public AjaxResult listPage(Page page, GasTankWarning gasTankWarning) {
-        return AjaxResult.success(gasTankWarningService.listPage(page, gasTankWarning));
+    public R<?> listPage(Page page, GasTankWarning gasTankWarning) {
+        return R.ok(gasTankWarningService.listPage(page, gasTankWarning));
     }
 
     @PostMapping("/add")
-    public AjaxResult add(@RequestBody GasTankWarning gasTankWarning) {
-        return AjaxResult.success(gasTankWarningService.save(gasTankWarning));
+    public R<?> add(@RequestBody GasTankWarning gasTankWarning) {
+        return R.ok(gasTankWarningService.save(gasTankWarning));
     }
 
     @PostMapping("update")
-    public AjaxResult update(@RequestBody GasTankWarning gasTankWarning) {
-        return AjaxResult.success(gasTankWarningService.updateById(gasTankWarning));
+    public R<?> update(@RequestBody GasTankWarning gasTankWarning) {
+        return R.ok(gasTankWarningService.updateById(gasTankWarning));
     }
 
     @DeleteMapping("delete")
-    public AjaxResult delete(@RequestBody List<Long> ids) {
-        if (CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
-        return AjaxResult.success(gasTankWarningService.removeByIds(ids));
+    public R<?> delete(@RequestBody List<Long> ids) {
+        if (CollectionUtils.isEmpty(ids)) return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        return R.ok(gasTankWarningService.removeByIds(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..d78a5e1 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/InboundManagementController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/InboundManagementController.java
@@ -4,7 +4,7 @@
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.procurementrecord.pojo.InboundManagement;
 import com.ruoyi.procurementrecord.service.InboundManagementService;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -30,35 +30,35 @@
 
     @GetMapping("/listPage")
     @Operation(summary = "鍒拌揣绠$悊-鏌ヨ")
-    public AjaxResult listPage(Page page, InboundManagement inboundManagement) {
+    public R<?> listPage(Page page, InboundManagement inboundManagement) {
         IPage<InboundManagement> result = inboundManagementService.listPage(page, inboundManagement);
-        return AjaxResult.success(result);
+        return R.ok(result);
     }
 
     @PostMapping("/add")
     @Operation(summary = "鍒拌揣绠$悊-娣诲姞")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult add(@RequestBody InboundManagement inboundManagement) {
+    public R<?> add(@RequestBody InboundManagement inboundManagement) {
         inboundManagement.setArrivalTime(new Date());
         boolean result = inboundManagementService.save(inboundManagement);
-        return result ? AjaxResult.success() : AjaxResult.error();
+        return result ? R.ok() : R.fail();
     }
 
     @PostMapping("/update")
     @Operation(summary = "鍒拌揣绠$悊-淇敼")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult update(@RequestBody InboundManagement inboundManagement) {
+    public R<?> update(@RequestBody InboundManagement inboundManagement) {
         boolean result = inboundManagementService.updateById(inboundManagement);
-        return result ? AjaxResult.success() : AjaxResult.error();
+        return result ? R.ok() : R.fail();
     }
 
     @DeleteMapping("/del")
     @Operation(summary = "鍒拌揣绠$悊-鍒犻櫎")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult del(@RequestBody List<Long> ids) {
-        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+    public R<?> del(@RequestBody List<Long> ids) {
+        if(CollectionUtils.isEmpty(ids)) return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         boolean result = inboundManagementService.removeByIds(ids);
-        return result ? AjaxResult.success() : AjaxResult.error();
+        return result ? R.ok() : R.fail();
     }
 
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementExceptionRecordController.java b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementExceptionRecordController.java
index bb14493..df8b8e2 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementExceptionRecordController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementExceptionRecordController.java
@@ -1,7 +1,7 @@
 package com.ruoyi.procurementrecord.controller;
 
 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.mapper.ProcurementExceptionRecordMapper;
 import com.ruoyi.procurementrecord.pojo.ProcurementExceptionRecord;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -23,13 +23,13 @@
 
     @PostMapping("/add")
     @Transactional
-    public AjaxResult add(@RequestBody ProcurementExceptionRecord procurementExceptionRecord) {
-        return AjaxResult.success(procurementExceptionRecordMapper.insert(procurementExceptionRecord));
+    public R<?> add(@RequestBody ProcurementExceptionRecord procurementExceptionRecord) {
+        return R.ok(procurementExceptionRecordMapper.insert(procurementExceptionRecord));
     }
 
     @PostMapping("/update")
     @Transactional
-    public AjaxResult updatePro(@RequestBody ProcurementExceptionRecord procurementExceptionRecord) {
-        return AjaxResult.success(procurementExceptionRecordMapper.updateById(procurementExceptionRecord));
+    public R<?> updatePro(@RequestBody ProcurementExceptionRecord procurementExceptionRecord) {
+        return R.ok(procurementExceptionRecordMapper.updateById(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..a110a5c 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPlanController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPlanController.java
@@ -3,7 +3,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.procurementrecord.pojo.ProcurementPlan;
 import com.ruoyi.procurementrecord.service.ProcurementPlanService;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -28,30 +28,30 @@
 
     @RequestMapping("/listPage")
     @Operation(summary = "閲囪喘璁″垝-鏌ヨ")
-    public AjaxResult listPage(Page page, ProcurementPlan procurementPlan){
+    public R<?> listPage(Page page, ProcurementPlan procurementPlan){
         IPage<ProcurementPlan> result = procurementPlanService.listPage(page, procurementPlan);
-        return AjaxResult.success(result);
+        return R.ok(result);
     }
 
     @PostMapping("/add")
     @Operation(summary = "閲囪喘璁″垝-娣诲姞")
-    public AjaxResult add(@RequestBody ProcurementPlan procurementPlan){
+    public R<?> add(@RequestBody ProcurementPlan procurementPlan){
         boolean result = procurementPlanService.save(procurementPlan);
-        return result ? AjaxResult.success() : AjaxResult.error();
+        return result ? R.ok() : R.fail();
     }
 
     @PostMapping("/update")
     @Operation(summary = "閲囪喘璁″垝-淇敼")
-    public AjaxResult update(@RequestBody ProcurementPlan procurementPlan){
+    public R<?> update(@RequestBody ProcurementPlan procurementPlan){
         boolean result = procurementPlanService.updateById(procurementPlan);
-        return result ? AjaxResult.success() : AjaxResult.error();
+        return result ? R.ok() : R.fail();
     }
 
     @DeleteMapping("/del")
     @Operation(summary = "閲囪喘璁″垝-鍒犻櫎")
-    public AjaxResult del(@RequestBody List<Long> ids){
+    public R<?> del(@RequestBody List<Long> ids){
         boolean result = procurementPlanService.removeByIds(ids);
-        return result ? AjaxResult.success() : AjaxResult.error();
+        return result ? R.ok() : R.fail();
     }
 
     /**
diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPriceManagementController.java b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPriceManagementController.java
index 678446c..35ae216 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPriceManagementController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPriceManagementController.java
@@ -3,7 +3,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.procurementrecord.pojo.ProcurementPriceManagement;
 import com.ruoyi.procurementrecord.service.ProcurementPriceManagementService;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -29,36 +29,36 @@
 
     @GetMapping("/listPage")
     @Operation(summary = "閲囪喘浠锋牸绠$悊-鏌ヨ")
-    public AjaxResult listPage(Page page, ProcurementPriceManagement procurementPriceManagement){
+    public R<?> listPage(Page page, ProcurementPriceManagement procurementPriceManagement){
         IPage<ProcurementPriceManagement> result = procurementPriceManagementService.listPage(page, procurementPriceManagement);
-        return AjaxResult.success(result);
+        return R.ok(result);
     }
 
     @PostMapping("/add")
     @Operation(summary = "閲囪喘浠锋牸绠$悊-娣诲姞")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult add(@RequestBody ProcurementPriceManagement procurementPriceManagement){
+    public R<?> add(@RequestBody ProcurementPriceManagement procurementPriceManagement){
         boolean result = procurementPriceManagementService.save(procurementPriceManagement);
-        return result ? AjaxResult.success() : AjaxResult.error();
+        return result ? R.ok() : R.fail();
     }
 
     @PostMapping("/update")
     @Operation(summary = "閲囪喘浠锋牸绠$悊-淇敼")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult update(@RequestBody ProcurementPriceManagement procurementPriceManagement){
+    public R<?> update(@RequestBody ProcurementPriceManagement procurementPriceManagement){
         boolean result = procurementPriceManagementService.updateById(procurementPriceManagement);
-        return result ? AjaxResult.success() : AjaxResult.error();
+        return result ? R.ok() : R.fail();
     }
 
     @DeleteMapping("/del")
     @Operation(summary = "閲囪喘浠锋牸绠$悊-鍒犻櫎")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult delete(@RequestBody List<Long> ids){
+    public R<?> delete(@RequestBody List<Long> ids){
         if (ids == null || ids.isEmpty()) {
-            return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+            return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
         }
         boolean result = procurementPriceManagementService.removeByIds(ids);
-        return result ? AjaxResult.success() : AjaxResult.error();
+        return result ? R.ok() : R.fail();
     }
 
     /**
diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
index 7e49990..6f16f19 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
@@ -7,7 +7,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.procurementrecord.bean.dto.*;
 import com.ruoyi.procurementrecord.mapper.CustomStorageMapper;
 import com.ruoyi.procurementrecord.pojo.CustomStorage;
@@ -44,139 +44,139 @@
      */
     @GetMapping("/getProcurementAmount")
     @Operation(summary = "閫氳繃閿�鍞骇鍝乮d鑾峰彇鍏ュ簱鏁伴噺")
-    public AjaxResult getProcurementAmount(@RequestParam("salesProductId") Long salesProductId) {
-        return AjaxResult.success(procurementRecordService.getProcurementAmount(salesProductId));
+    public R<?> getProcurementAmount(@RequestParam("salesProductId") Long salesProductId) {
+        return R.ok(procurementRecordService.getProcurementAmount(salesProductId));
     }
 
 
     @GetMapping("/productlist")
     @Log(title = "閲囪喘鍏ュ簱-鍏ュ簱绠$悊-鏂板鍏ュ簱鏌ヨ", businessType = BusinessType.OTHER)
-    public AjaxResult list(ProcurementDto procurementDto) {
+    public R<?> list(ProcurementDto procurementDto) {
         List<ProcurementDto> result = procurementRecordService.listProcurementBySalesLedgerId(procurementDto);
-        return AjaxResult.success(result);
+        return R.ok(result);
     }
 
     @PostMapping("/add")
     @Log(title = "閲囪喘鍏ュ簱-鍏ュ簱绠$悊-鏂板鍏ュ簱", businessType = BusinessType.INSERT)
     @Transactional
-    public AjaxResult add(@RequestBody ProcurementAddDto procurementDto) {
+    public R<?> add(@RequestBody ProcurementAddDto procurementDto) {
         procurementDto.setType(1);
         procurementDto.setTypeName("閲囪喘鍏ュ簱");
-        return AjaxResult.success(procurementRecordService.add(procurementDto));
+        return R.ok(procurementRecordService.add(procurementDto));
     }
 
     @PostMapping("/addCustom")
     @Log(title = "鑷畾涔夊叆搴�-鍏ュ簱绠$悊-鏂板鍏ュ簱", businessType = BusinessType.INSERT)
     @Transactional
-    public AjaxResult addCustom(@RequestBody List<CustomStorage> customStorage) {
+    public R<?> addCustom(@RequestBody List<CustomStorage> customStorage) {
         return procurementRecordService.addCustom(customStorage);
     }
 
     @PostMapping("/updateCustom")
     @Log(title = "鑷畾涔夊叆搴�-鍏ュ簱绠$悊-淇敼鍏ュ簱", businessType = BusinessType.UPDATE)
     @Transactional
-    public AjaxResult updateCustom(@RequestBody CustomStorage customStorage) {
+    public R<?> updateCustom(@RequestBody CustomStorage customStorage) {
         return procurementRecordService.updateCustom(customStorage);
     }
 
     @Delete("/delteCustom")
     @Log(title = "鑷畾涔夊叆搴�-鍏ュ簱绠$悊-鍒犻櫎鍏ュ簱", businessType = BusinessType.DELETE)
     @Transactional
-    public AjaxResult deleteCustom(@RequestBody List<Long> ids) {
+    public R<?> deleteCustom(@RequestBody List<Long> ids) {
         return procurementRecordService.deleteCustom(ids);
     }
 
     @PostMapping("/update")
     @Log(title = "閲囪喘鍏ュ簱-鍏ュ簱绠$悊-淇敼鍏ュ簱", businessType = BusinessType.UPDATE)
     @Transactional
-    public AjaxResult updatePro(@RequestBody ProcurementUpdateDto procurementDto) {
-        return AjaxResult.success(procurementRecordService.updatePro(procurementDto));
+    public R<?> updatePro(@RequestBody ProcurementUpdateDto procurementDto) {
+        return R.ok(procurementRecordService.updatePro(procurementDto));
     }
 
     @PostMapping("/updateManagement")
     @Log(title = "鎴愬搧鍏ュ簱-搴撳瓨鍙拌处-淇敼", businessType = BusinessType.UPDATE)
     @Transactional
-    public AjaxResult updateManagement(@RequestBody ProcurementManagementUpdateDto procurementDto) {
-        return AjaxResult.success(procurementRecordService.updateManagement(procurementDto));
+    public R<?> updateManagement(@RequestBody ProcurementManagementUpdateDto procurementDto) {
+        return R.ok(procurementRecordService.updateManagement(procurementDto));
     }
 
     @PostMapping("/updateManagementByCustom")
     @Log(title = "鑷畾涔夊叆搴�-搴撳瓨鍙拌处-淇敼", businessType = BusinessType.UPDATE)
     @Transactional
-    public AjaxResult updateManagementByCustom(@RequestBody ProcurementManagementUpdateDto procurementDto) {
-        return AjaxResult.success(procurementRecordService.updateManagementByCustom(procurementDto));
+    public R<?> updateManagementByCustom(@RequestBody ProcurementManagementUpdateDto procurementDto) {
+        return R.ok(procurementRecordService.updateManagementByCustom(procurementDto));
     }
 
     @PostMapping("/del")
     @Log(title = "閲囪喘鍏ュ簱-鍏ュ簱绠$悊-鍒犻櫎鍏ュ簱", businessType = BusinessType.DELETE)
     @Transactional
-    public AjaxResult deletePro(@RequestBody ProcurementUpdateDto procurementDto) {
-        return AjaxResult.success(procurementRecordService.deletePro(procurementDto));
+    public R<?> deletePro(@RequestBody ProcurementUpdateDto procurementDto) {
+        return R.ok(procurementRecordService.deletePro(procurementDto));
     }
 
     @GetMapping("/listPage")
     @Log(title = "閲囪喘鍏ュ簱-鍏ュ簱绠$悊-鍏ュ簱鏌ヨ", businessType = BusinessType.OTHER)
     @Operation(summary = "鍏ュ簱鏌ヨ")
-    public AjaxResult listPage(Page page, ProcurementPageDto procurementDto) {
+    public R<?> listPage(Page page, ProcurementPageDto procurementDto) {
         IPage<ProcurementPageDto> result = procurementRecordService.listPage(page, procurementDto);
-        return AjaxResult.success(result);
+        return R.ok(result);
     }
 
     @GetMapping("/listReport")
     @Operation(summary = "鏌ヨ搴撳瓨鍥捐〃鏁版嵁")
-    public AjaxResult listReport() {
-        return AjaxResult.success(procurementRecordService.getReportList());
+    public R<?> listReport() {
+        return R.ok(procurementRecordService.getReportList());
     }
 
     @GetMapping("/listPageByProduction")
     @Log(title = "鐢熶骇鍏ュ簱-鍏ュ簱绠$悊-鍏ュ簱鏌ヨ", businessType = BusinessType.OTHER)
     @Operation(summary = "鍏ュ簱鏌ヨ")
-    public AjaxResult listPageByProduction(Page page, ProcurementPageDto procurementDto) {
+    public R<?> listPageByProduction(Page page, ProcurementPageDto procurementDto) {
         IPage<ProcurementPageDto> result = procurementRecordService.listPageByProduction(page, procurementDto);
-        return AjaxResult.success(result);
+        return R.ok(result);
     }
 
     @GetMapping("/listPageByProductProduction")
     @Log(title = "鐢熶骇鍏ュ簱-鍏ュ簱绠$悊-鐢熶骇鍏ュ簱鏌ヨ", businessType = BusinessType.OTHER)
     @Operation(summary = "鍏ュ簱鏌ヨ")
-    public AjaxResult listPageByProductProduction(Page page, ProcurementPageDto procurementDto) {
+    public R<?> listPageByProductProduction(Page page, ProcurementPageDto procurementDto) {
         IPage<ProcurementPageDto> result = procurementRecordService.listPageByProductProduction(page, procurementDto);
-        return AjaxResult.success(result);
+        return R.ok(result);
     }
 
     @GetMapping("/listPageByCustom")
     @Log(title = "鑷畾涔夊叆搴�-鍏ュ簱绠$悊-鍏ュ簱鏌ヨ", businessType = BusinessType.OTHER)
     @Operation(summary = "鍏ュ簱鏌ヨ")
-    public AjaxResult listPageByCustom(Page page, CustomStorage customStorage) {
+    public R<?> listPageByCustom(Page page, CustomStorage customStorage) {
         IPage<CustomStorage> result = procurementRecordService.listPageByCustom(page, customStorage);
-        return AjaxResult.success(result);
+        return R.ok(result);
     }
 
     @GetMapping("/listPageCopy")
     @Log(title = "閲囪喘鍏ュ簱-搴撳瓨绠$悊-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
-    public AjaxResult listPageCopy(Page page, ProcurementPageDto procurementDto) {
+    public R<?> listPageCopy(Page page, ProcurementPageDto procurementDto) {
         IPage<ProcurementPageDtoCopy> result = procurementRecordService.listPageCopy(page, procurementDto);
-        return AjaxResult.success(result);
+        return R.ok(result);
     }
 
     @GetMapping("/listPageCopyByProduction")
     @Log(title = "鐢熶骇鍏ュ簱-搴撳瓨绠$悊-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
-    public AjaxResult listPageCopyByProduction(Page page, ProcurementPageDto procurementDto) {
+    public R<?> listPageCopyByProduction(Page page, ProcurementPageDto procurementDto) {
         IPage<ProcurementPageDtoCopy> result = procurementRecordService.listPageCopyByProduction(page, procurementDto);
-        return AjaxResult.success(result);
+        return R.ok(result);
     }
 
     @GetMapping("/listPageCopyByCustom")
     @Log(title = "鑷畾涔夊叆搴�-搴撳瓨绠$悊-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
-    public AjaxResult listPageCopyByCustom(Page page, CustomStorage customStorage) {
+    public R<?> listPageCopyByCustom(Page page, CustomStorage customStorage) {
         IPage<CustomStorage> result = procurementRecordService.listPageCopyByCustom(page, customStorage);
-        return AjaxResult.success(result);
+        return R.ok(result);
     }
 
     @GetMapping("/getReportList")
     @Log(title = "搴撳瓨鎶ヨ〃鏌ヨ", businessType = BusinessType.OTHER)
-    public AjaxResult getReportList(Page page, ProcurementPageDto procurementDto) {
-        return AjaxResult.success(procurementRecordService.getReportList(page, procurementDto));
+    public R<?> getReportList(Page page, ProcurementPageDto procurementDto) {
+        return R.ok(procurementRecordService.getReportList(page, procurementDto));
     }
 
     /**
@@ -244,8 +244,8 @@
 
     @GetMapping("/listPageProductionStock")
     @Log(title = "搴撳瓨绠$悊-鎴愬搧搴撳瓨", businessType = BusinessType.OTHER)
-    public AjaxResult listPageProductionStock(Page page, ProcurementPageDto procurementDto) {
+    public R<?> listPageProductionStock(Page page, ProcurementPageDto procurementDto) {
         IPage<ProductModel> result = procurementRecordService.listPageProductionStock(page, procurementDto);
-        return AjaxResult.success(result);
+        return R.ok(result);
     }
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java
index c86d3e6..8d8e62f 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java
@@ -6,7 +6,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.procurementrecord.bean.dto.ProcurementRecordOutAdd;
 import com.ruoyi.procurementrecord.bean.dto.ProcurementRecordOutPageDto;
 import com.ruoyi.procurementrecord.bean.dto.ProcurementUpdateDto;
@@ -34,42 +34,42 @@
 
     @PostMapping("/stockout")
     @Log(title = "閲囪喘鍑哄簱-鍑哄簱绠$悊-鍑哄簱", businessType = BusinessType.INSERT)
-    public AjaxResult stockout(@RequestBody ProcurementRecordOutAdd procurementRecordOutAdd) {
-        return AjaxResult.success(procurementRecordOutService.stockout(procurementRecordOutAdd));
+    public R<?> stockout(@RequestBody ProcurementRecordOutAdd procurementRecordOutAdd) {
+        return R.ok(procurementRecordOutService.stockout(procurementRecordOutAdd));
     }
 
     @GetMapping("/listPage")
     @Log(title = "閲囪喘鍑哄簱-鍑哄簱鍙拌处-鍑哄簱鏌ヨ", businessType = BusinessType.OTHER)
-    public AjaxResult listPage(Page page, ProcurementRecordOutPageDto procurementDto) {
+    public R<?> listPage(Page page, ProcurementRecordOutPageDto procurementDto) {
         IPage<ProcurementRecordOutPageDto> result = procurementRecordOutService.listPage(page, procurementDto);
-        return AjaxResult.success(result);
+        return R.ok(result);
     }
 
     @GetMapping("/listPageByProduct")
     @Log(title = "鐢熶骇鍑哄簱-鍑哄簱鍙拌处-鍑哄簱鏌ヨ", businessType = BusinessType.OTHER)
-    public AjaxResult listPageByProduct(Page page, ProcurementRecordOutPageDto procurementDto) {
+    public R<?> listPageByProduct(Page page, ProcurementRecordOutPageDto procurementDto) {
         IPage<ProcurementRecordOutPageDto> result = procurementRecordOutService.listPageByProduct(page, procurementDto);
-        return AjaxResult.success(result);
+        return R.ok(result);
     }
 
     @GetMapping("/listPageBySemiProduct")
     @Log(title = "鐢熶骇鍑哄簱-鍑哄簱鍙拌处-鍑哄簱鏌ヨ", businessType = BusinessType.OTHER)
-    public AjaxResult listPageBySemiProduct(Page page, ProcurementRecordOutPageDto procurementDto) {
+    public R<?> listPageBySemiProduct(Page page, ProcurementRecordOutPageDto procurementDto) {
         IPage<ProcurementRecordOutPageDto> result = procurementRecordOutService.listPageBySemiProduct(page, procurementDto);
-        return AjaxResult.success(result);
+        return R.ok(result);
     }
 
     @GetMapping("/listPageByCustom")
     @Log(title = "鑷畾涔夊嚭搴�-鍑哄簱鍙拌处-鍑哄簱鏌ヨ", businessType = BusinessType.OTHER)
-    public AjaxResult listPageByCustom(Page page, ProcurementRecordOutPageDto procurementDto) {
+    public R<?> listPageByCustom(Page page, ProcurementRecordOutPageDto procurementDto) {
         IPage<ProcurementRecordOutPageDto> result = procurementRecordOutService.listPageByCustom(page, procurementDto);
-        return AjaxResult.success(result);
+        return R.ok(result);
     }
 
     @PostMapping("/del")
     @Log(title = "閲囪喘鍑哄簱-鍑哄簱鍙拌处-鍒犻櫎鍑哄簱", businessType = BusinessType.DELETE)
-    public AjaxResult deletePro(@RequestBody ProcurementUpdateDto procurementDto) {
-        return AjaxResult.success(procurementRecordOutService.deletePro(procurementDto));
+    public R<?> deletePro(@RequestBody ProcurementUpdateDto procurementDto) {
+        return R.ok(procurementRecordOutService.deletePro(procurementDto));
     }
 
     /**
diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/ReturnManagementController.java b/src/main/java/com/ruoyi/procurementrecord/controller/ReturnManagementController.java
index b3f31b9..f8ca338 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/ReturnManagementController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/ReturnManagementController.java
@@ -5,7 +5,7 @@
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.procurementrecord.bean.dto.ReturnManagementDto;
 import com.ruoyi.procurementrecord.bean.vo.ShippingInfoVo;
 import com.ruoyi.procurementrecord.pojo.ReturnSaleProduct;
@@ -34,58 +34,58 @@
 
     @GetMapping("/listPage")
     @Operation(summary = "閿�鍞��璐�-鏌ヨ")
-    public AjaxResult listPage(Page page, ReturnManagementDto returnManagement) {
+    public R<?> listPage(Page page, ReturnManagementDto returnManagement) {
         IPage<ReturnManagementDto> result = returnManagementService.listPage(page, returnManagement);
-        return AjaxResult.success(result);
+        return R.ok(result);
     }
 
     @PostMapping("/add")
     @Operation(summary = "閿�鍞��璐�-娣诲姞")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult add(@RequestBody ReturnManagementDto returnManagementDto) {
-        return returnManagementService.addReturnManagementDto(returnManagementDto) ? success() : error();
+    public R<?> add(@RequestBody ReturnManagementDto returnManagementDto) {
+        return returnManagementService.addReturnManagementDto(returnManagementDto) ? R.ok() : R.fail();
     }
 
     @PostMapping("/update")
     @Operation(summary = "閿�鍞��璐�-淇敼")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult update(@RequestBody ReturnManagementDto returnManagementDto) {
-        return returnManagementService.updateReturnManagementDto(returnManagementDto) ? success() : error();
+    public R<?> update(@RequestBody ReturnManagementDto returnManagementDto) {
+        return returnManagementService.updateReturnManagementDto(returnManagementDto) ? R.ok() : R.fail();
     }
 
 
     @Operation(summary = "閿�鍞��璐�-澶勭悊閫�璐у崟")
     @GetMapping("/handle")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult handle(Long returnManagementId) {
-        return returnManagementService.handle(returnManagementId) ? success() : error();
+    public R<?> handle(Long returnManagementId) {
+        return returnManagementService.handle(returnManagementId) ? R.ok() : R.fail();
     }
 
 
     @DeleteMapping("/del")
     @Operation(summary = "閿�鍞��璐�-鍒犻櫎")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult del(@RequestBody List<Long> ids) {
-        if (CollectionUtils.isEmpty(ids)) return error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+    public R<?> del(@RequestBody List<Long> ids) {
+        if (CollectionUtils.isEmpty(ids)) return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         returnSaleProductService.remove(new QueryWrapper<ReturnSaleProduct>()
                 .lambda()
                 .in(ReturnSaleProduct::getReturnManagementId, ids));
         boolean result = returnManagementService.removeByIds(ids);
-        return result ? success() : error();
+        return result ? R.ok() : R.fail();
     }
 
     @GetMapping("/getById")
     @Operation(summary = "閿�鍞��璐�-鏍规嵁id鏌ヨ")
-    public AjaxResult getById(Long returnManagementId) {
+    public R<?> getById(Long returnManagementId) {
         ReturnManagementDto returnManagementDto = returnManagementService.getReturnManagementDtoById(returnManagementId);
-        return success(returnManagementDto);
+        return R.ok(returnManagementDto);
     }
 
     @GetMapping("/getByShippingId")
     @Operation(summary = "閿�鍞��璐�-鏍规嵁鍙戣揣鍗曟煡璇㈤攢鍞鍗曚互鍙婂嚭搴撶殑浜у搧淇℃伅")
-    public AjaxResult getByShippingId(Long shippingId) {
+    public R<?> getByShippingId(Long shippingId) {
         ShippingInfoVo shippingInfoVo = returnManagementService.getReturnManagementDtoByShippingIdId(shippingId);
-        return success(shippingInfoVo);
+        return R.ok(shippingInfoVo);
     }
 
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/mapper/ReturnManagementMapper.java b/src/main/java/com/ruoyi/procurementrecord/mapper/ReturnManagementMapper.java
index 815559c..e0eae1a 100644
--- a/src/main/java/com/ruoyi/procurementrecord/mapper/ReturnManagementMapper.java
+++ b/src/main/java/com/ruoyi/procurementrecord/mapper/ReturnManagementMapper.java
@@ -3,8 +3,8 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.account.bean.dto.SalesReturnDto;
-import com.ruoyi.account.bean.vo.SalesReturnVo;
+import com.ruoyi.account.bean.dto.sales.SalesReturnDto;
+import com.ruoyi.account.bean.vo.sales.SalesReturnVo;
 import com.ruoyi.procurementrecord.bean.dto.ReturnManagementDto;
 import com.ruoyi.procurementrecord.pojo.ReturnManagement;
 import org.apache.ibatis.annotations.Param;
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
index a209cf9..b7d9cad 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
@@ -4,7 +4,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.basic.pojo.ProductModel;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.procurementrecord.bean.dto.*;
 import com.ruoyi.procurementrecord.pojo.CustomStorage;
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
@@ -43,7 +43,7 @@
 
     IPage<ProcurementPageDto> listPageByProduction(Page page, ProcurementPageDto procurementDto);
 
-    AjaxResult addCustom(List<CustomStorage> customStorage);
+    R<?> addCustom(List<CustomStorage> customStorage);
 
     IPage<CustomStorage> listPageByCustom(Page page, CustomStorage customStorage);
 
@@ -51,9 +51,9 @@
 
     IPage<CustomStorage> listPageCopyByCustom(Page page, CustomStorage customStorage);
 
-    AjaxResult updateCustom(CustomStorage customStorage);
+    R<?> updateCustom(CustomStorage customStorage);
 
-    AjaxResult deleteCustom(List<Long> ids);
+    R<?> deleteCustom(List<Long> ids);
 
     int updateManagementByCustom(ProcurementManagementUpdateDto procurementDto);
 
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 1d99dec..3fc8d0f 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -11,7 +11,7 @@
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.security.LoginUser;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.procurementrecord.bean.dto.*;
 import com.ruoyi.procurementrecord.mapper.CustomStorageMapper;
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
@@ -525,10 +525,10 @@
     private final CustomStorageMapper customStorageMapper;
 
     @Override
-    public AjaxResult addCustom(List<CustomStorage> customStorage) {
+    public R<?> addCustom(List<CustomStorage> customStorage) {
         LoginUser loginUser = SecurityUtils.getLoginUser();
         if(CollectionUtils.isEmpty(customStorage)){
-            return AjaxResult.error("鏁版嵁涓嶈兘涓虹┖");
+            return R.fail("鏁版嵁涓嶈兘涓虹┖");
         }
         customStorage.forEach(item -> {
             // 鏌ヨ閲囪喘鍏ュ簱鏁伴噺
@@ -538,7 +538,7 @@
             item.setCode(OrderUtils.countTodayByCreateTime(customStorageMapper, "", "code"));
             customStorageMapper.insert(item);
         });
-        return AjaxResult.success("鑷畾涔夊叆搴撴垚鍔�");
+        return R.ok(null, "鑷畾涔夊叆搴撴垚鍔�");
     }
 
     @Override
@@ -716,13 +716,13 @@
     }
 
     @Override
-    public AjaxResult updateCustom(CustomStorage customStorage) {
-        return AjaxResult.success(customStorageMapper.updateById(customStorage));
+    public R<?> updateCustom(CustomStorage customStorage) {
+        return R.ok(customStorageMapper.updateById(customStorage));
     }
 
     @Override
-    public AjaxResult deleteCustom(List<Long> ids) {
-        return AjaxResult.success(customStorageMapper.deleteBatchIds(ids));
+    public R<?> deleteCustom(List<Long> ids) {
+        return R.ok(customStorageMapper.deleteBatchIds(ids));
     }
 
     @Override
diff --git a/src/main/java/com/ruoyi/production/bean/dto/ProductionOperationTaskDto.java b/src/main/java/com/ruoyi/production/bean/dto/ProductionOperationTaskDto.java
index 965cbf3..8a75dcd 100644
--- a/src/main/java/com/ruoyi/production/bean/dto/ProductionOperationTaskDto.java
+++ b/src/main/java/com/ruoyi/production/bean/dto/ProductionOperationTaskDto.java
@@ -44,4 +44,7 @@
     @Schema(description = "缁撴潫鏃ユ湡")
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     private LocalDate endDate;
+
+    @Schema(description = "鏄惁鐢熶骇")
+    private Integer isProduction;
 }
diff --git a/src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingController.java b/src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingController.java
index dda1aa0..2765c10 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingController.java
@@ -39,7 +39,7 @@
     @PostMapping("/updateRouteItem")
     @Operation(summary = "淇敼鐢熶骇璁㈠崟鐨勫伐鑹鸿矾绾胯鎯�")
     public R updateRouteItem(@RequestBody ProductionOrderRoutingOperation productionOrderRoutingOperation) {
-        return R.ok(productionOrderRoutingOperationService.updateById(productionOrderRoutingOperation));
+        return R.ok(productionOrderRoutingOperationService.updateRouteItem(productionOrderRoutingOperation));
     }
 
     @DeleteMapping("/deleteRouteItem/{id}")
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductionOrderMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductionOrderMapper.java
index e52df0c..cec7ca5 100644
--- a/src/main/java/com/ruoyi/production/mapper/ProductionOrderMapper.java
+++ b/src/main/java/com/ruoyi/production/mapper/ProductionOrderMapper.java
@@ -12,6 +12,7 @@
 
 import java.time.LocalDateTime;
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -39,4 +40,24 @@
 
     Integer countPending(@Param("startDate") String startDate, @Param("endDate") String endDate);
 
+    List<Map<String, Object>> selectHomeOrderProgressPage(@Param("status") Integer status,
+                                                          @Param("offset") Long offset,
+                                                          @Param("size") Long size,
+                                                          @Param("startTime") LocalDateTime startTime,
+                                                          @Param("endTime") LocalDateTime endTime);
+
+    Long countHomeOrderProgress(@Param("status") Integer status,
+                                @Param("startTime") LocalDateTime startTime,
+                                @Param("endTime") LocalDateTime endTime);
+
+    List<Map<String, Object>> countHomeOrderProgressByStatus(@Param("startTime") LocalDateTime startTime,
+                                                              @Param("endTime") LocalDateTime endTime);
+
+    List<Map<String, Object>> selectHomeTodayProductionPlan(@Param("size") Long size,
+                                                             @Param("planStart") LocalDateTime planStart,
+                                                             @Param("planEnd") LocalDateTime planEnd);
+
+    Long countHomeTodayProductionPlan(@Param("planStart") LocalDateTime planStart,
+                                      @Param("planEnd") LocalDateTime planEnd);
+
 }
diff --git a/src/main/java/com/ruoyi/production/service/ProductionOrderRoutingOperationService.java b/src/main/java/com/ruoyi/production/service/ProductionOrderRoutingOperationService.java
index 2377dc3..8878006 100644
--- a/src/main/java/com/ruoyi/production/service/ProductionOrderRoutingOperationService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductionOrderRoutingOperationService.java
@@ -8,6 +8,8 @@
 
     R addRouteItem(ProductionOrderRoutingOperation productionOrderRoutingOperation);
 
+    R updateRouteItem(ProductionOrderRoutingOperation productionOrderRoutingOperation);
+
     R deleteRouteItem(Long id);
 
     int sortRouteItem(ProductionOrderRoutingOperation productionOrderRoutingOperation);
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java
index 31cdc79..40dd74c 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java
@@ -23,6 +23,7 @@
 import com.ruoyi.production.pojo.ProductionOrderRoutingOperationParam;
 import com.ruoyi.production.pojo.ProductionProductMain;
 import com.ruoyi.production.service.ProductionBomStructureService;
+import com.ruoyi.production.util.TaskPlanQuantityUtil;
 import com.ruoyi.technology.mapper.TechnologyOperationMapper;
 import com.ruoyi.technology.mapper.TechnologyOperationParamMapper;
 import com.ruoyi.technology.mapper.TechnologyParamMapper;
@@ -262,7 +263,7 @@
                 .filter(item -> item != null && item.getId() != null)
                 .collect(Collectors.toMap(ProductionOrderRoutingOperation::getId, item -> item, (left, right) -> left));
         // Keep task plan quantities aligned with the same order BOM snapshot demand used during snapshot creation.
-        Map<String, BigDecimal> demandedQuantityMap = buildOperationDemandedQuantityMap(structureList, rootProductModelId);
+        Map<String, BigDecimal> demandedQuantityMap = TaskPlanQuantityUtil.buildOperationDemandedQuantityMap(structureList, rootProductModelId);
         for (ProductionOperationTask task : taskList) {
             if (task == null || task.getId() == null || task.getProductionOrderRoutingOperationId() == null) {
                 continue;
@@ -291,8 +292,15 @@
                                             ProductionOrderBom orderBom,
                                             List<ProductionBomStructure> structureList,
                                             Long rootProductModelId) {
+        // 閲嶆柊鏌ヨBOM缁撴瀯锛屾寜瀛愯妭鐐逛紭鍏堟帓搴�
+        List<ProductionBomStructure> routingStructureList = this.list(
+                Wrappers.<ProductionBomStructure>lambdaQuery()
+                        .eq(ProductionBomStructure::getProductionOrderBomId, orderBom.getId())
+                        .orderByDesc(ProductionBomStructure::getParentId)
+                        .orderByAsc(ProductionBomStructure::getId));
+
         ProductionOrderRouting orderRouting = getOrCreateOrderRoutingSnapshot(productionOrderId, productionOrder, orderBom, rootProductModelId);
-        List<ProductionOrderRoutingOperation> desiredOperationList = buildDesiredRoutingOperationList(structureList, rootProductModelId);
+        List<ProductionOrderRoutingOperation> desiredOperationList = buildDesiredRoutingOperationList(routingStructureList, rootProductModelId);
         List<ProductionOrderRoutingOperation> existingOperationList = productionOrderRoutingOperationMapper.selectList(
                 Wrappers.<ProductionOrderRoutingOperation>lambdaQuery()
                         .eq(ProductionOrderRoutingOperation::getOrderRoutingId, orderRouting.getId())
@@ -310,7 +318,7 @@
             if (matchedOperation == null) {
                 matchedOperation = insertRoutingOperationSnapshot(orderRouting.getId(), productionOrderId, desiredOperation);
             } else {
-                updateRoutingOperationSnapshotIfNecessary(desiredOperation, orderRouting.getId(), productionOrderId, matchedOperation);
+                updateRoutingOperationSnapshotIfNecessary(matchedOperation, orderRouting.getId(), productionOrderId, desiredOperation);
             }
             finalOperationList.add(matchedOperation);
         }
@@ -381,14 +389,14 @@
         Map<Long, ProductionBomStructure> structureById = structureList.stream()
                 .filter(item -> item != null && item.getId() != null)
                 .collect(Collectors.toMap(ProductionBomStructure::getId, item -> item, (left, right) -> left));
+
+        // 鏋勫缓鐖�-瀛愭槧灏勫叧绯�
+        Map<Long, List<ProductionBomStructure>> treeMap = buildParentChildMap(structureList);
+
+        // 浣跨敤鍚庡簭閬嶅巻鏋勫缓鎿嶄綔鍒楄〃锛堝厛瀛愬悗鐖讹紝纭繚宸ヨ壓璺嚎椤哄簭姝g‘锛�
         Map<String, ProductionBomStructure> uniqueOperationMap = new LinkedHashMap<>();
-        for (ProductionBomStructure bomStructure : structureList) {
-            if (bomStructure == null || bomStructure.getTechnologyOperationId() == null) {
-                continue;
-            }
-            Long outputProductModelId = resolveOutputProductModelId(resolveOperationOutputNode(bomStructure, structureById), rootProductModelId);
-            uniqueOperationMap.putIfAbsent(buildBomOperationDedupKey(bomStructure, outputProductModelId), bomStructure);
-        }
+        buildOperationListPostOrder(null, treeMap, uniqueOperationMap, structureById, rootProductModelId);
+
         List<ProductionOrderRoutingOperation> desiredOperationList = new ArrayList<>();
         int dragSort = 1;
         for (ProductionBomStructure bomStructure : uniqueOperationMap.values()) {
@@ -405,6 +413,52 @@
             desiredOperationList.add(routingOperation);
         }
         return desiredOperationList;
+    }
+
+    private Map<Long, List<ProductionBomStructure>> buildParentChildMap(List<ProductionBomStructure> structureList) {
+        Map<Long, List<ProductionBomStructure>> treeMap = new LinkedHashMap<>();
+        Map<Long, Integer> childCountMap = new HashMap<>();
+
+        // 绗竴閬嶏細缁熻姣忎釜鑺傜偣鐨勫瓙鑺傜偣鏁伴噺锛屽悓鏃舵瀯寤哄垵濮嬫槧灏�
+        for (ProductionBomStructure structure : structureList) {
+            if (structure == null) continue;
+            Long parentId = structure.getParentId();
+            childCountMap.merge(parentId, 1, Integer::sum);  // 缁熻姣忎釜鐖惰妭鐐规湁澶氬皯涓瓙鑺傜偣
+            treeMap.computeIfAbsent(parentId, k -> new ArrayList<>()).add(structure);
+        }
+
+        // 绗簩閬嶏細瀵规瘡涓埗鑺傜偣涓嬬殑瀛愯妭鐐规寜瀛愯妭鐐规暟閲忓�掑簭鎺掑簭锛堟湁瀛愯妭鐐圭殑浼樺厛锛�
+        for (Map.Entry<Long, List<ProductionBomStructure>> entry : treeMap.entrySet()) {
+            List<ProductionBomStructure> children = entry.getValue();
+            children.sort((a, b) -> {
+                int countA = childCountMap.getOrDefault(a.getId(), 0);
+                int countB = childCountMap.getOrDefault(b.getId(), 0);
+                return Integer.compare(countB, countA);  // 瀛愯妭鐐瑰鐨勬帓鍓嶉潰
+            });
+        }
+
+        return treeMap;
+    }
+
+    private void buildOperationListPostOrder(Long parentId,
+                                             Map<Long, List<ProductionBomStructure>> treeMap,
+                                             Map<String, ProductionBomStructure> uniqueOperationMap,
+                                             Map<Long, ProductionBomStructure> structureById,
+                                             Long rootProductModelId) {
+        List<ProductionBomStructure> children = treeMap.get(parentId);
+        if (children == null || children.isEmpty()) {
+            return;
+        }
+        for (ProductionBomStructure child : children) {
+            // 鍏堥�掑綊澶勭悊瀛愯妭鐐�
+            buildOperationListPostOrder(child.getId(), treeMap, uniqueOperationMap, structureById, rootProductModelId);
+
+            // 鍐嶅鐞嗗綋鍓嶈妭鐐�
+            if (child.getTechnologyOperationId() != null) {
+                Long outputProductModelId = resolveOutputProductModelId(resolveOperationOutputNode(child, structureById), rootProductModelId);
+                uniqueOperationMap.putIfAbsent(buildBomOperationDedupKey(child, outputProductModelId), child);
+            }
+        }
     }
 
     private Map<String, Deque<ProductionOrderRoutingOperation>> buildExistingRoutingOperationBucketMap(List<ProductionOrderRoutingOperation> existingOperationList) {
@@ -482,6 +536,12 @@
         if (!Objects.equals(currentOperation.getIsProduction(), desiredOperation.getIsProduction())) {
             update.setIsProduction(desiredOperation.getIsProduction());
             currentOperation.setIsProduction(desiredOperation.getIsProduction());
+            changed = true;
+        }
+        // 鏇存柊 dragSort 瀛楁锛岀‘淇濆伐鑹鸿矾绾块『搴忔纭�
+        if (!Objects.equals(currentOperation.getDragSort(), desiredOperation.getDragSort())) {
+            update.setDragSort(desiredOperation.getDragSort());
+            currentOperation.setDragSort(desiredOperation.getDragSort());
             changed = true;
         }
         if (!Objects.equals(currentOperation.getType(), desiredOperation.getType())) {
@@ -744,8 +804,8 @@
             return;
         }
         for (ProductionBomStructureDto node : source) {
+            flattenTree(node.getChildren(), result);  // 鍏堥�掑綊娣诲姞瀛愯妭鐐�
             result.add(node);
-            flattenTree(node.getChildren(), result);
         }
     }
 
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationServiceImpl.java
index 3d16a07..75d0696 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationServiceImpl.java
@@ -4,21 +4,15 @@
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.framework.web.domain.R;
-import com.ruoyi.production.mapper.ProductionOperationTaskMapper;
-import com.ruoyi.production.mapper.ProductionOrderRoutingOperationMapper;
-import com.ruoyi.production.mapper.ProductionOrderRoutingOperationParamMapper;
-import com.ruoyi.production.mapper.ProductionProductMainMapper;
-import com.ruoyi.production.pojo.ProductionOperationTask;
-import com.ruoyi.production.pojo.ProductionOrderRoutingOperation;
-import com.ruoyi.production.pojo.ProductionOrderRoutingOperationParam;
-import com.ruoyi.production.pojo.ProductionProductMain;
+import com.ruoyi.production.mapper.*;
+import com.ruoyi.production.util.TaskPlanQuantityUtil;
+import com.ruoyi.technology.mapper.*;
+import com.ruoyi.production.pojo.*;
 import com.ruoyi.production.service.ProductionOrderRoutingOperationService;
 import com.ruoyi.production.service.ProductionProductMainService;
-import com.ruoyi.technology.mapper.TechnologyOperationParamMapper;
-import com.ruoyi.technology.mapper.TechnologyParamMapper;
-import com.ruoyi.technology.pojo.TechnologyOperationParam;
-import com.ruoyi.technology.pojo.TechnologyParam;
+import com.ruoyi.technology.pojo.*;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -26,8 +20,7 @@
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
 
 @Service
 @Transactional(rollbackFor = Exception.class)
@@ -42,6 +35,11 @@
     private final TechnologyOperationParamMapper technologyOperationParamMapper;
     private final TechnologyParamMapper technologyParamMapper;
     private final ProductionOrderRoutingOperationParamMapper productionOrderRoutingOperationParamMapper;
+    private final ProductionOrderMapper productionOrderMapper;
+    private final ProductionOrderRoutingMapper productionOrderRoutingMapper;
+    private final ProductionOrderBomMapper productionOrderBomMapper;
+    private final ProductionBomStructureMapper productionBomStructureMapper;
+    private final TechnologyRoutingOperationMapper technologyRoutingOperationMapper;
 
     @Override
     public R addRouteItem(ProductionOrderRoutingOperation productionOrderRoutingOperation) {
@@ -102,6 +100,109 @@
             productionOperationTaskMapper.insert(productionOperationTask);
         }
         return R.ok();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R updateRouteItem(ProductionOrderRoutingOperation productionOrderRoutingOperation) {
+        Long operationId = productionOrderRoutingOperation.getId();
+
+        // 鏇存柊宸ヨ壓璺嚎宸ュ簭
+        productionOrderRoutingOperationMapper.updateById(productionOrderRoutingOperation);
+
+        // 閲嶆柊鏌ヨ瀹屾暣璁板綍锛堝墠绔彲鑳芥病鏈変紶閫掓墍鏈夊瓧娈碉紝濡� productionOrderId锛�
+        ProductionOrderRoutingOperation updatedOperation = productionOrderRoutingOperationMapper.selectById(operationId);
+        if (updatedOperation == null) {
+            throw new ServiceException("宸ヨ壓璺嚎宸ュ簭涓嶅瓨鍦�");
+        }
+
+        // 鏌ヨ鏄惁瀛樺湪宸ュ崟
+        ProductionOperationTask productionOperationTask = productionOperationTaskMapper.selectOne(
+                new LambdaQueryWrapper<ProductionOperationTask>()
+                        .eq(ProductionOperationTask::getProductionOrderRoutingOperationId, operationId)
+                        .last("limit 1"));
+
+        // 鏍规嵁鏄惁闇�瑕佺敓浜ц繘琛屽鐞�
+        Boolean isProduction = updatedOperation.getIsProduction();
+
+        if (Boolean.TRUE.equals(isProduction)) {
+            // 闇�瑕佺敓浜э細妫�鏌ュ伐鍗曟槸鍚﹀瓨鍦紝涓嶅瓨鍦ㄥ垯鐢熸垚
+            if (productionOperationTask == null) {
+                ProductionOperationTask task = new ProductionOperationTask();
+                task.setProductionOrderRoutingOperationId(updatedOperation.getId());
+                task.setProductionOrderId(updatedOperation.getProductionOrderId());
+                // 鑾峰彇鐢熶骇璁㈠崟
+                ProductionOrder productionOrder = productionOrderMapper.selectById(updatedOperation.getProductionOrderId());
+                if (productionOrder == null) {
+                    throw new ServiceException("鐢熶骇璁㈠崟涓嶅瓨鍦�");
+                }
+
+                // 鑾峰彇璁㈠崟BOM
+                ProductionOrderBom orderBom = productionOrderBomMapper.selectOne(
+                        Wrappers.<ProductionOrderBom>lambdaQuery()
+                                .eq(ProductionOrderBom::getProductionOrderId, productionOrder.getId()));
+
+                // 纭畾鏍逛骇鍝佽鏍糏D
+                Long rootProductModelId = orderBom != null && orderBom.getProductModelId() != null
+                        ? orderBom.getProductModelId()
+                        : productionOrder.getProductModelId();
+
+                // 鑾峰彇BOM缁撴瀯鍒楄〃
+                List<ProductionBomStructure> orderBomStructureList = orderBom == null || orderBom.getId() == null
+                        ? Collections.emptyList()
+                        : productionBomStructureMapper.selectList(
+                        Wrappers.<ProductionBomStructure>lambdaQuery()
+                                .eq(ProductionBomStructure::getProductionOrderBomId, orderBom.getId())
+                                .orderByAsc(ProductionBomStructure::getId));
+
+                // 鏋勫缓宸ュ簭闇�姹傞噺鏄犲皠
+                Map<String, BigDecimal> operationDemandedQuantityMap =
+                        TaskPlanQuantityUtil.buildOperationDemandedQuantityMap(orderBomStructureList, rootProductModelId);
+
+                // 鑾峰彇宸ヨ壓璺嚎宸ュ簭锛堢敤浜庤绠楄鍒掓暟閲忥級
+                TechnologyRoutingOperation sourceOperation = technologyRoutingOperationMapper.selectById(
+                        updatedOperation.getTechnologyRoutingOperationId());
+                // 灏嗗師鏉ョ殑绉佹湁鏂规硶鏇挎崲涓鸿皟鐢ㄥ伐鍏风被
+                BigDecimal planQuantity = TaskPlanQuantityUtil.resolveTaskPlanQuantity(
+                        sourceOperation,
+                        operationDemandedQuantityMap,
+                        productionOrder,
+                        rootProductModelId);
+                task.setPlanQuantity(planQuantity);
+                task.setCompleteQuantity(BigDecimal.ZERO);
+                task.setWorkOrderNo(generateNextTaskNo());
+                task.setStatus(2);
+                productionOperationTaskMapper.insert(task);
+            }
+        } else {
+            // 涓嶉渶瑕佺敓浜э細妫�鏌ュ伐鍗曟槸鍚﹀瓨鍦�
+            if (productionOperationTask != null) {
+                validateTaskCanRemove(productionOperationTask);
+                // 娌℃湁鎶ュ伐锛屽垯鍒犻櫎宸ュ崟
+                productionOperationTaskMapper.deleteById(productionOperationTask.getId());
+            }
+        }
+
+        return R.ok();
+    }
+
+    private void validateTaskCanRemove(ProductionOperationTask task) {
+        if (task == null || task.getId() == null) {
+            return;
+        }
+        if (defaultDecimal(task.getCompleteQuantity()).compareTo(BigDecimal.ZERO) > 0) {
+            throw new ServiceException("宸ュ簭宸蹭骇鐢熸姤宸ヨ褰曪紝鏃犳硶鏍规嵁 BOM 鍙樻洿鍒犻櫎瀵瑰簲宸ュ簭蹇収");
+        }
+        long reportCount = productionProductMainMapper.selectCount(
+                Wrappers.<ProductionProductMain>lambdaQuery()
+                        .eq(ProductionProductMain::getProductionOperationTaskId, task.getId()));
+        if (reportCount > 0) {
+            throw new ServiceException("宸ュ簭宸蹭骇鐢熸姤宸ヨ褰曪紝鏃犳硶鏍规嵁 BOM 鍙樻洿鍒犻櫎瀵瑰簲宸ュ崟");
+        }
+    }
+
+    private BigDecimal defaultDecimal(BigDecimal value) {
+        return value == null ? BigDecimal.ZERO : value;
     }
 
     @Override
@@ -182,4 +283,24 @@
         }
         return 0;
     }
+
+    private String generateNextTaskNo() {
+        // 鐢熸垚涓嬩竴涓敓浜у伐鍗曞彿
+        String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+        String prefix = "GD" + datePrefix;
+        ProductionOperationTask lastTask = productionOperationTaskMapper.selectOne(
+                Wrappers.<ProductionOperationTask>lambdaQuery()
+                        .likeRight(ProductionOperationTask::getWorkOrderNo, prefix)
+                        .orderByDesc(ProductionOperationTask::getWorkOrderNo)
+                        .last("limit 1"));
+        int sequence = 1;
+        if (lastTask != null && lastTask.getWorkOrderNo() != null && lastTask.getWorkOrderNo().startsWith(prefix)) {
+            try {
+                sequence = Integer.parseInt(lastTask.getWorkOrderNo().substring(prefix.length())) + 1;
+            } catch (NumberFormatException ignored) {
+                sequence = 1;
+            }
+        }
+        return prefix + String.format("%03d", sequence);
+    }
 }
diff --git a/src/main/java/com/ruoyi/production/util/TaskPlanQuantityUtil.java b/src/main/java/com/ruoyi/production/util/TaskPlanQuantityUtil.java
new file mode 100644
index 0000000..e82d7e4
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/util/TaskPlanQuantityUtil.java
@@ -0,0 +1,137 @@
+package com.ruoyi.production.util;
+
+import com.ruoyi.production.pojo.ProductionBomStructure;
+import com.ruoyi.production.pojo.ProductionOrder;
+import com.ruoyi.production.pojo.ProductionOrderRoutingOperation;
+import com.ruoyi.technology.pojo.TechnologyRoutingOperation;
+import lombok.experimental.UtilityClass;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 宸ュ崟璁″垝鏁伴噺璁$畻宸ュ叿绫�
+ */
+@UtilityClass
+public class TaskPlanQuantityUtil {
+
+    /**
+     * 璁$畻宸ュ崟璁″垝鏁伴噺锛堜娇鐢� TechnologyRoutingOperation锛�
+     */
+    public BigDecimal resolveTaskPlanQuantity(TechnologyRoutingOperation sourceOperation,
+                                              Map<String, BigDecimal> operationDemandedQuantityMap,
+                                              ProductionOrder productionOrder,
+                                              Long rootProductModelId) {
+        if (sourceOperation == null || operationDemandedQuantityMap == null || operationDemandedQuantityMap.isEmpty()) {
+            return defaultDecimal(productionOrder == null ? null : productionOrder.getQuantity());
+        }
+        Long outputProductModelId = sourceOperation.getProductModelId() != null
+                ? sourceOperation.getProductModelId()
+                : rootProductModelId;
+        String key = buildOperationDemandedQuantityKey(sourceOperation.getTechnologyOperationId(), outputProductModelId);
+        BigDecimal planQuantity = operationDemandedQuantityMap.get(key);
+        return planQuantity != null ? planQuantity : defaultDecimal(productionOrder == null ? null : productionOrder.getQuantity());
+    }
+
+    /**
+     * 璁$畻宸ュ崟璁″垝鏁伴噺锛堜娇鐢� ProductionOrderRoutingOperation锛�
+     */
+    public BigDecimal resolveTaskPlanQuantity(ProductionOrderRoutingOperation routingOperation,
+                                              Map<String, BigDecimal> demandedQuantityMap,
+                                              BigDecimal orderQuantity,
+                                              Long rootProductModelId) {
+        if (routingOperation == null || demandedQuantityMap == null || demandedQuantityMap.isEmpty()) {
+            return orderQuantity;
+        }
+        Long outputProductModelId = routingOperation.getProductModelId() != null
+                ? routingOperation.getProductModelId()
+                : rootProductModelId;
+        String key = buildOperationDemandedQuantityKey(routingOperation.getTechnologyOperationId(), outputProductModelId);
+        BigDecimal planQuantity = demandedQuantityMap.get(key);
+        return planQuantity != null ? planQuantity : orderQuantity;
+    }
+
+    /**
+     * 鏋勫缓宸ュ簭闇�姹傞噺鏄犲皠琛�
+     */
+    public Map<String, BigDecimal> buildOperationDemandedQuantityMap(List<ProductionBomStructure> bomStructures, Long rootProductModelId) {
+        if (bomStructures == null || bomStructures.isEmpty()) {
+            return Collections.emptyMap();
+        }
+        Map<Long, ProductionBomStructure> structureById = new HashMap<>();
+        for (ProductionBomStructure item : bomStructures) {
+            if (item != null && item.getId() != null) {
+                structureById.put(item.getId(), item);
+            }
+        }
+        Map<String, BigDecimal> demandedQuantityMap = new HashMap<>();
+        Set<String> mergedOutputNodeKeySet = new HashSet<>();
+        for (ProductionBomStructure bomStructure : bomStructures) {
+            if (bomStructure == null || bomStructure.getTechnologyOperationId() == null) {
+                continue;
+            }
+            ProductionBomStructure outputNode = resolveOperationOutputNode(bomStructure, structureById);
+            Long outputProductModelId = resolveOutputProductModelId(outputNode, rootProductModelId);
+            if (outputProductModelId == null) {
+                continue;
+            }
+            String mergedOutputNodeKey = buildOperationOutputNodeKey(bomStructure.getTechnologyOperationId(),
+                    outputNode == null ? null : outputNode.getId(), outputProductModelId);
+            if (!mergedOutputNodeKeySet.add(mergedOutputNodeKey)) {
+                continue;
+            }
+            BigDecimal demandedQuantity = defaultDecimal(outputNode == null ? null : outputNode.getDemandedQuantity());
+            String key = buildOperationDemandedQuantityKey(bomStructure.getTechnologyOperationId(), outputProductModelId);
+            demandedQuantityMap.merge(key, demandedQuantity, BigDecimal::add);
+        }
+        return demandedQuantityMap;
+    }
+
+    /**
+     * 鏋勫缓宸ュ簭闇�姹傞噺key
+     */
+    public String buildOperationDemandedQuantityKey(Long operationId, Long outputProductModelId) {
+        return String.valueOf(operationId) + "#" + String.valueOf(outputProductModelId);
+    }
+
+    /**
+     * 鏋勫缓杈撳嚭鑺傜偣key
+     */
+    public String buildOperationOutputNodeKey(Long operationId, Long outputNodeId, Long outputProductModelId) {
+        return String.valueOf(operationId) + "#" + String.valueOf(outputNodeId) + "#" + String.valueOf(outputProductModelId);
+    }
+
+    /**
+     * 瑙f瀽宸ュ簭杈撳嚭鑺傜偣
+     */
+    public ProductionBomStructure resolveOperationOutputNode(ProductionBomStructure bomStructure,
+                                                             Map<Long, ProductionBomStructure> structureById) {
+        if (bomStructure == null) {
+            return null;
+        }
+        if (bomStructure.getParentId() == null) {
+            return bomStructure;
+        }
+        ProductionBomStructure parent = structureById.get(bomStructure.getParentId());
+        return parent != null ? parent : bomStructure;
+    }
+
+    /**
+     * 瑙f瀽杈撳嚭浜у搧瑙勬牸ID
+     */
+    public Long resolveOutputProductModelId(ProductionBomStructure outputNode, Long rootProductModelId) {
+        if (outputNode == null) {
+            return rootProductModelId;
+        }
+        return outputNode.getProductModelId() != null ? outputNode.getProductModelId() : rootProductModelId;
+    }
+
+    /**
+     * 榛樿BigDecimal鍊�
+     */
+    public BigDecimal defaultDecimal(BigDecimal value) {
+        return value == null ? BigDecimal.ZERO : value;
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/project/common/CaptchaController.java b/src/main/java/com/ruoyi/project/common/CaptchaController.java
index 40255cb..efa004f 100644
--- a/src/main/java/com/ruoyi/project/common/CaptchaController.java
+++ b/src/main/java/com/ruoyi/project/common/CaptchaController.java
@@ -1,98 +1,100 @@
-package com.ruoyi.project.common;
-
-import com.google.code.kaptcha.Producer;
-import com.ruoyi.common.constant.CacheConstants;
-import com.ruoyi.common.constant.Constants;
-import com.ruoyi.common.utils.sign.Base64;
-import com.ruoyi.common.utils.uuid.IdUtils;
-import com.ruoyi.framework.redis.RedisCache;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.project.system.service.ISysConfigService;
-import jakarta.annotation.Resource;
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.RequiredArgsConstructor;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.util.FastByteArrayOutputStream;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.imageio.ImageIO;
-import java.awt.image.BufferedImage;
-import java.io.IOException;
-import java.util.concurrent.TimeUnit;
-
-/**
- * 楠岃瘉鐮佹搷浣滃鐞�
- * 
- * @author ruoyi
- */
-@RestController
-@RequiredArgsConstructor
-public class CaptchaController
-{
-    @Resource(name = "captchaProducer")
-    private Producer captchaProducer;
-
-    @Resource(name = "captchaProducerMath")
-    private Producer captchaProducerMath;
-
-    private final RedisCache redisCache;
-    
-    // 楠岃瘉鐮佺被鍨�
-    @Value("${ruoyi.captchaType}")
-    private String captchaType;
-    
-    private final ISysConfigService configService;
-
-    /**
-     * 鐢熸垚楠岃瘉鐮�
-     */
-    @GetMapping("/captchaImage")
-    public AjaxResult getCode(HttpServletResponse response) throws IOException
-    {
-        AjaxResult ajax = AjaxResult.success();
-        boolean captchaEnabled = configService.selectCaptchaEnabled();
-        ajax.put("captchaEnabled", captchaEnabled);
-        if (!captchaEnabled)
-        {
-            return ajax;
-        }
-
-        // 淇濆瓨楠岃瘉鐮佷俊鎭�
-        String uuid = IdUtils.simpleUUID();
-        String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid;
-
-        String capStr = null, code = null;
-        BufferedImage image = null;
-
-        // 鐢熸垚楠岃瘉鐮�
-        if ("math".equals(captchaType))
-        {
-            String capText = captchaProducerMath.createText();
-            capStr = capText.substring(0, capText.lastIndexOf("@"));
-            code = capText.substring(capText.lastIndexOf("@") + 1);
-            image = captchaProducerMath.createImage(capStr);
-        }
-        else if ("char".equals(captchaType))
-        {
-            capStr = code = captchaProducer.createText();
-            image = captchaProducer.createImage(capStr);
-        }
-
-        redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
-        // 杞崲娴佷俊鎭啓鍑�
-        FastByteArrayOutputStream os = new FastByteArrayOutputStream();
-        try
-        {
-            ImageIO.write(image, "jpg", os);
-        }
-        catch (IOException e)
-        {
-            return AjaxResult.error(e.getMessage());
-        }
-
-        ajax.put("uuid", uuid);
-        ajax.put("img", Base64.encode(os.toByteArray()));
-        return ajax;
-    }
-}
+package com.ruoyi.project.common;
+
+import com.google.code.kaptcha.Producer;
+import com.ruoyi.common.constant.CacheConstants;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.utils.sign.Base64;
+import com.ruoyi.common.utils.uuid.IdUtils;
+import com.ruoyi.framework.redis.RedisCache;
+import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.project.system.service.ISysConfigService;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.util.FastByteArrayOutputStream;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 楠岃瘉鐮佹搷浣滃鐞�
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequiredArgsConstructor
+public class CaptchaController
+{
+    @Resource(name = "captchaProducer")
+    private Producer captchaProducer;
+
+    @Resource(name = "captchaProducerMath")
+    private Producer captchaProducerMath;
+
+    private final RedisCache redisCache;
+
+    // 楠岃瘉鐮佺被鍨�
+    @Value("${ruoyi.captchaType}")
+    private String captchaType;
+
+    private final ISysConfigService configService;
+
+    /**
+     * 鐢熸垚楠岃瘉鐮�
+     */
+    @GetMapping("/captchaImage")
+    public R<?> getCode(HttpServletResponse response) throws IOException
+    {
+        Map<String, Object> map = new HashMap<>();
+        boolean captchaEnabled = configService.selectCaptchaEnabled();
+        map.put("captchaEnabled", captchaEnabled);
+        if (!captchaEnabled)
+        {
+            return R.ok(map);
+        }
+
+        // 淇濆瓨楠岃瘉鐮佷俊鎭�
+        String uuid = IdUtils.simpleUUID();
+        String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid;
+
+        String capStr = null, code = null;
+        BufferedImage image = null;
+
+        // 鐢熸垚楠岃瘉鐮�
+        if ("math".equals(captchaType))
+        {
+            String capText = captchaProducerMath.createText();
+            capStr = capText.substring(0, capText.lastIndexOf("@"));
+            code = capText.substring(capText.lastIndexOf("@") + 1);
+            image = captchaProducerMath.createImage(capStr);
+        }
+        else if ("char".equals(captchaType))
+        {
+            capStr = code = captchaProducer.createText();
+            image = captchaProducer.createImage(capStr);
+        }
+
+        redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
+        // 杞崲娴佷俊鎭啓鍑�
+        FastByteArrayOutputStream os = new FastByteArrayOutputStream();
+        try
+        {
+            ImageIO.write(image, "jpg", os);
+        }
+        catch (IOException e)
+        {
+            return R.fail(e.getMessage());
+        }
+
+        map.put("uuid", uuid);
+        map.put("img", Base64.encode(os.toByteArray()));
+        return R.ok(map);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/project/monitor/controller/CacheController.java b/src/main/java/com/ruoyi/project/monitor/controller/CacheController.java
index 63fe76b..ab4841d 100644
--- a/src/main/java/com/ruoyi/project/monitor/controller/CacheController.java
+++ b/src/main/java/com/ruoyi/project/monitor/controller/CacheController.java
@@ -1,111 +1,112 @@
-package com.ruoyi.project.monitor.controller;
-
-import com.ruoyi.common.constant.CacheConstants;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.project.monitor.domain.SysCache;
-import lombok.AllArgsConstructor;
-import org.springframework.data.redis.core.RedisCallback;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.*;
-
-/**
- * 缂撳瓨鐩戞帶
- * 
- * @author ruoyi
- */
-@RestController
-@RequestMapping("/monitor/cache")
-@AllArgsConstructor
-public class CacheController
-{
-    private RedisTemplate<String, String> redisTemplate;
-
-    private final static List<SysCache> caches = new ArrayList<SysCache>();
-    {
-        caches.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "鐢ㄦ埛淇℃伅"));
-        caches.add(new SysCache(CacheConstants.SYS_CONFIG_KEY, "閰嶇疆淇℃伅"));
-        caches.add(new SysCache(CacheConstants.SYS_DICT_KEY, "鏁版嵁瀛楀吀"));
-        caches.add(new SysCache(CacheConstants.CAPTCHA_CODE_KEY, "楠岃瘉鐮�"));
-        caches.add(new SysCache(CacheConstants.REPEAT_SUBMIT_KEY, "闃查噸鎻愪氦"));
-        caches.add(new SysCache(CacheConstants.RATE_LIMIT_KEY, "闄愭祦澶勭悊"));
-        caches.add(new SysCache(CacheConstants.PWD_ERR_CNT_KEY, "瀵嗙爜閿欒娆℃暟"));
-    }
-
-    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
-    @GetMapping()
-    public AjaxResult getInfo() throws Exception
-    {
-        Properties info = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info());
-        Properties commandStats = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info("commandstats"));
-        Object dbSize = redisTemplate.execute((RedisCallback<Object>) connection -> connection.dbSize());
-
-        Map<String, Object> result = new HashMap<>(3);
-        result.put("info", info);
-        result.put("dbSize", dbSize);
-
-        List<Map<String, String>> pieList = new ArrayList<>();
-        commandStats.stringPropertyNames().forEach(key -> {
-            Map<String, String> data = new HashMap<>(2);
-            String property = commandStats.getProperty(key);
-            data.put("name", StringUtils.removeStart(key, "cmdstat_"));
-            data.put("value", StringUtils.substringBetween(property, "calls=", ",usec"));
-            pieList.add(data);
-        });
-        result.put("commandStats", pieList);
-        return AjaxResult.success(result);
-    }
-
-    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
-    @GetMapping("/getNames")
-    public AjaxResult cache()
-    {
-        return AjaxResult.success(caches);
-    }
-
-    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
-    @GetMapping("/getKeys/{cacheName}")
-    public AjaxResult getCacheKeys(@PathVariable String cacheName)
-    {
-        Set<String> cacheKeys = redisTemplate.keys(cacheName + "*");
-        return AjaxResult.success(new TreeSet<>(cacheKeys));
-    }
-
-    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
-    @GetMapping("/getValue/{cacheName}/{cacheKey}")
-    public AjaxResult getCacheValue(@PathVariable String cacheName, @PathVariable String cacheKey)
-    {
-        String cacheValue = redisTemplate.opsForValue().get(cacheKey);
-        SysCache sysCache = new SysCache(cacheName, cacheKey, cacheValue);
-        return AjaxResult.success(sysCache);
-    }
-
-    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
-    @DeleteMapping("/clearCacheName/{cacheName}")
-    public AjaxResult clearCacheName(@PathVariable String cacheName)
-    {
-        Collection<String> cacheKeys = redisTemplate.keys(cacheName + "*");
-        redisTemplate.delete(cacheKeys);
-        return AjaxResult.success();
-    }
-
-    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
-    @DeleteMapping("/clearCacheKey/{cacheKey}")
-    public AjaxResult clearCacheKey(@PathVariable String cacheKey)
-    {
-        redisTemplate.delete(cacheKey);
-        return AjaxResult.success();
-    }
-
-    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
-    @DeleteMapping("/clearCacheAll")
-    public AjaxResult clearCacheAll()
-    {
-        Collection<String> cacheKeys = redisTemplate.keys("*");
-        redisTemplate.delete(cacheKeys);
-        return AjaxResult.success();
-    }
-}
+package com.ruoyi.project.monitor.controller;
+
+import com.ruoyi.common.constant.CacheConstants;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.project.monitor.domain.SysCache;
+import lombok.AllArgsConstructor;
+import org.springframework.data.redis.core.RedisCallback;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+
+/**
+ * 缂撳瓨鐩戞帶
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/monitor/cache")
+@AllArgsConstructor
+public class CacheController extends BaseController
+{
+    private RedisTemplate<String, String> redisTemplate;
+
+    private final static List<SysCache> caches = new ArrayList<SysCache>();
+    {
+        caches.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "鐢ㄦ埛淇℃伅"));
+        caches.add(new SysCache(CacheConstants.SYS_CONFIG_KEY, "閰嶇疆淇℃伅"));
+        caches.add(new SysCache(CacheConstants.SYS_DICT_KEY, "鏁版嵁瀛楀吀"));
+        caches.add(new SysCache(CacheConstants.CAPTCHA_CODE_KEY, "楠岃瘉鐮�"));
+        caches.add(new SysCache(CacheConstants.REPEAT_SUBMIT_KEY, "闃查噸鎻愪氦"));
+        caches.add(new SysCache(CacheConstants.RATE_LIMIT_KEY, "闄愭祦澶勭悊"));
+        caches.add(new SysCache(CacheConstants.PWD_ERR_CNT_KEY, "瀵嗙爜閿欒娆℃暟"));
+    }
+
+    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
+    @GetMapping()
+    public R<?> getInfo() throws Exception
+    {
+        Properties info = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info());
+        Properties commandStats = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info("commandstats"));
+        Object dbSize = redisTemplate.execute((RedisCallback<Object>) connection -> connection.dbSize());
+
+        Map<String, Object> result = new HashMap<>(3);
+        result.put("info", info);
+        result.put("dbSize", dbSize);
+
+        List<Map<String, String>> pieList = new ArrayList<>();
+        commandStats.stringPropertyNames().forEach(key -> {
+            Map<String, String> data = new HashMap<>(2);
+            String property = commandStats.getProperty(key);
+            data.put("name", StringUtils.removeStart(key, "cmdstat_"));
+            data.put("value", StringUtils.substringBetween(property, "calls=", ",usec"));
+            pieList.add(data);
+        });
+        result.put("commandStats", pieList);
+        return R.ok(result);
+    }
+
+    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
+    @GetMapping("/getNames")
+    public R<?> cache()
+    {
+        return R.ok(caches);
+    }
+
+    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
+    @GetMapping("/getKeys/{cacheName}")
+    public R<?> getCacheKeys(@PathVariable String cacheName)
+    {
+        Set<String> cacheKeys = redisTemplate.keys(cacheName + "*");
+        return R.ok(new TreeSet<>(cacheKeys));
+    }
+
+    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
+    @GetMapping("/getValue/{cacheName}/{cacheKey}")
+    public R<?> getCacheValue(@PathVariable String cacheName, @PathVariable String cacheKey)
+    {
+        String cacheValue = redisTemplate.opsForValue().get(cacheKey);
+        SysCache sysCache = new SysCache(cacheName, cacheKey, cacheValue);
+        return R.ok(sysCache);
+    }
+
+    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
+    @DeleteMapping("/clearCacheName/{cacheName}")
+    public R<?> clearCacheName(@PathVariable String cacheName)
+    {
+        Collection<String> cacheKeys = redisTemplate.keys(cacheName + "*");
+        redisTemplate.delete(cacheKeys);
+        return R.ok();
+    }
+
+    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
+    @DeleteMapping("/clearCacheKey/{cacheKey}")
+    public R<?> clearCacheKey(@PathVariable String cacheKey)
+    {
+        redisTemplate.delete(cacheKey);
+        return R.ok();
+    }
+
+    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
+    @DeleteMapping("/clearCacheAll")
+    public R<?> clearCacheAll()
+    {
+        Collection<String> cacheKeys = redisTemplate.keys("*");
+        redisTemplate.delete(cacheKeys);
+        return R.ok();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/project/monitor/controller/ServerController.java b/src/main/java/com/ruoyi/project/monitor/controller/ServerController.java
index 9a50b05..a2db092 100644
--- a/src/main/java/com/ruoyi/project/monitor/controller/ServerController.java
+++ b/src/main/java/com/ruoyi/project/monitor/controller/ServerController.java
@@ -1,27 +1,28 @@
-package com.ruoyi.project.monitor.controller;
-
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.framework.web.domain.Server;
-
-/**
- * 鏈嶅姟鍣ㄧ洃鎺�
- * 
- * @author ruoyi
- */
-@RestController
-@RequestMapping("/monitor/server")
-public class ServerController
-{
-    @PreAuthorize("@ss.hasPermi('monitor:server:list')")
-    @GetMapping()
-    public AjaxResult getInfo() throws Exception
-    {
-        Server server = new Server();
-        server.copyTo();
-        return AjaxResult.success(server);
-    }
-}
+package com.ruoyi.project.monitor.controller;
+
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.framework.web.domain.Server;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 鏈嶅姟鍣ㄧ洃鎺�
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/monitor/server")
+public class ServerController extends BaseController
+{
+    @PreAuthorize("@ss.hasPermi('monitor:server:list')")
+    @GetMapping()
+    public R<?> getInfo() throws Exception
+    {
+        Server server = new Server();
+        server.copyTo();
+        return R.ok(server);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/project/monitor/controller/SysJobController.java b/src/main/java/com/ruoyi/project/monitor/controller/SysJobController.java
index ee2c058..9919311 100644
--- a/src/main/java/com/ruoyi/project/monitor/controller/SysJobController.java
+++ b/src/main/java/com/ruoyi/project/monitor/controller/SysJobController.java
@@ -1,186 +1,188 @@
-package com.ruoyi.project.monitor.controller;
-
-import java.util.List;
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.AllArgsConstructor;
-import org.quartz.SchedulerException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-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.constant.Constants;
-import com.ruoyi.common.exception.job.TaskException;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.common.utils.job.CronUtils;
-import com.ruoyi.common.utils.job.ScheduleUtils;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.framework.aspectj.lang.annotation.Log;
-import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
-import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.framework.web.page.TableDataInfo;
-import com.ruoyi.project.monitor.domain.SysJob;
-import com.ruoyi.project.monitor.service.ISysJobService;
-
-/**
- * 璋冨害浠诲姟淇℃伅鎿嶄綔澶勭悊
- * 
- * @author ruoyi
- */
-@RestController
-@RequestMapping("/monitor/job")
-@AllArgsConstructor
-public class SysJobController extends BaseController
-{
-    private ISysJobService jobService;
-
-    /**
-     * 鏌ヨ瀹氭椂浠诲姟鍒楄〃
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(SysJob sysJob)
-    {
-        startPage();
-        List<SysJob> list = jobService.selectJobList(sysJob);
-        return getDataTable(list);
-    }
-
-    /**
-     * 瀵煎嚭瀹氭椂浠诲姟鍒楄〃
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:export')")
-    @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(HttpServletResponse response, SysJob sysJob)
-    {
-        List<SysJob> list = jobService.selectJobList(sysJob);
-        ExcelUtil<SysJob> util = new ExcelUtil<SysJob>(SysJob.class);
-        util.exportExcel(response, list, "瀹氭椂浠诲姟");
-    }
-
-    /**
-     * 鑾峰彇瀹氭椂浠诲姟璇︾粏淇℃伅
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:query')")
-    @GetMapping(value = "/{jobId}")
-    public AjaxResult getInfo(@PathVariable("jobId") Long jobId)
-    {
-        return success(jobService.selectJobById(jobId));
-    }
-
-    /**
-     * 鏂板瀹氭椂浠诲姟
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:add')")
-    @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.INSERT)
-    @PostMapping
-    public AjaxResult add(@RequestBody SysJob job) throws SchedulerException, TaskException
-    {
-        if (!CronUtils.isValid(job.getCronExpression()))
-        {
-            return error("鏂板浠诲姟'" + job.getJobName() + "'澶辫触锛孋ron琛ㄨ揪寮忎笉姝g‘");
-        }
-        else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI))
-        {
-            return error("鏂板浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅厑璁�'rmi'璋冪敤");
-        }
-        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS }))
-        {
-            return error("鏂板浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅厑璁�'ldap(s)'璋冪敤");
-        }
-        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS }))
-        {
-            return error("鏂板浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅厑璁�'http(s)'璋冪敤");
-        }
-        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR))
-        {
-            return error("鏂板浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆瀛樺湪杩濊");
-        }
-        else if (!ScheduleUtils.whiteList(job.getInvokeTarget()))
-        {
-            return error("鏂板浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅湪鐧藉悕鍗曞唴");
-        }
-        job.setCreateBy(getUsername());
-        return toAjax(jobService.insertJob(job));
-    }
-
-    /**
-     * 淇敼瀹氭椂浠诲姟
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:edit')")
-    @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult edit(@RequestBody SysJob job) throws SchedulerException, TaskException
-    {
-        if (!CronUtils.isValid(job.getCronExpression()))
-        {
-            return error("淇敼浠诲姟'" + job.getJobName() + "'澶辫触锛孋ron琛ㄨ揪寮忎笉姝g‘");
-        }
-        else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI))
-        {
-            return error("淇敼浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅厑璁�'rmi'璋冪敤");
-        }
-        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS }))
-        {
-            return error("淇敼浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅厑璁�'ldap(s)'璋冪敤");
-        }
-        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS }))
-        {
-            return error("淇敼浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅厑璁�'http(s)'璋冪敤");
-        }
-        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR))
-        {
-            return error("淇敼浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆瀛樺湪杩濊");
-        }
-        else if (!ScheduleUtils.whiteList(job.getInvokeTarget()))
-        {
-            return error("淇敼浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅湪鐧藉悕鍗曞唴");
-        }
-        job.setUpdateBy(getUsername());
-        return toAjax(jobService.updateJob(job));
-    }
-
-    /**
-     * 瀹氭椂浠诲姟鐘舵�佷慨鏀�
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:changeStatus')")
-    @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.UPDATE)
-    @PutMapping("/changeStatus")
-    public AjaxResult changeStatus(@RequestBody SysJob job) throws SchedulerException
-    {
-        SysJob newJob = jobService.selectJobById(job.getJobId());
-        newJob.setStatus(job.getStatus());
-        return toAjax(jobService.changeStatus(newJob));
-    }
-
-    /**
-     * 瀹氭椂浠诲姟绔嬪嵆鎵ц涓�娆�
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:changeStatus')")
-    @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.UPDATE)
-    @PutMapping("/run")
-    public AjaxResult run(@RequestBody SysJob job) throws SchedulerException
-    {
-        boolean result = jobService.run(job);
-        return result ? success() : error("浠诲姟涓嶅瓨鍦ㄦ垨宸茶繃鏈燂紒");
-    }
-
-    /**
-     * 鍒犻櫎瀹氭椂浠诲姟
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:remove')")
-    @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{jobIds}")
-    public AjaxResult remove(@PathVariable Long[] jobIds) throws SchedulerException
-    {
-        jobService.deleteJobByIds(jobIds);
-        return success();
-    }
-}
+package com.ruoyi.project.monitor.controller;
+
+import java.util.List;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.AllArgsConstructor;
+import org.quartz.SchedulerException;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+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.constant.Constants;
+import com.ruoyi.common.exception.job.TaskException;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.job.CronUtils;
+import com.ruoyi.common.utils.job.ScheduleUtils;
+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.framework.web.page.TableDataInfo;
+import com.ruoyi.project.monitor.domain.SysJob;
+import com.ruoyi.project.monitor.service.ISysJobService;
+
+/**
+ * 璋冨害浠诲姟淇℃伅鎿嶄綔澶勭悊
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/monitor/job")
+@AllArgsConstructor
+public class SysJobController extends BaseController
+{
+    private ISysJobService jobService;
+
+    /**
+     * 鏌ヨ瀹氭椂浠诲姟鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('monitor:job:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysJob sysJob)
+    {
+        startPage();
+        List<SysJob> list = jobService.selectJobList(sysJob);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭瀹氭椂浠诲姟鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('monitor:job:export')")
+    @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, SysJob sysJob)
+    {
+        List<SysJob> list = jobService.selectJobList(sysJob);
+        ExcelUtil<SysJob> util = new ExcelUtil<SysJob>(SysJob.class);
+        util.exportExcel(response, list, "瀹氭椂浠诲姟");
+    }
+
+    /**
+     * 鑾峰彇瀹氭椂浠诲姟璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('monitor:job:query')")
+    @GetMapping(value = "/{jobId}")
+    public R<?> getInfo(@PathVariable("jobId") Long jobId)
+    {
+        return R.ok(jobService.selectJobById(jobId));
+    }
+
+    /**
+     * 鏂板瀹氭椂浠诲姟
+     */
+    @PreAuthorize("@ss.hasPermi('monitor:job:add')")
+    @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.INSERT)
+    @PostMapping
+    public R<?> add(@RequestBody SysJob job) throws SchedulerException, TaskException
+    {
+        if (!CronUtils.isValid(job.getCronExpression()))
+        {
+            return R.fail("鏂板浠诲姟'" + job.getJobName() + "'澶辫触锛孋ron琛ㄨ揪寮忎笉姝g‘");
+        }
+        else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI))
+        {
+            return R.fail("鏂板浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅厑璁�'rmi'璋冪敤");
+        }
+        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS }))
+        {
+            return R.fail("鏂板浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅厑璁�'ldap(s)'璋冪敤");
+        }
+        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS }))
+        {
+            return R.fail("鏂板浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅厑璁�'http(s)'璋冪敤");
+        }
+        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR))
+        {
+            return R.fail("鏂板浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆瀛樺湪杩濊");
+        }
+        else if (!ScheduleUtils.whiteList(job.getInvokeTarget()))
+        {
+            return R.fail("鏂板浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅湪鐧藉悕鍗曞唴");
+        }
+        job.setCreateBy(getUsername());
+        jobService.insertJob(job);
+        return R.ok();
+    }
+
+    /**
+     * 淇敼瀹氭椂浠诲姟
+     */
+    @PreAuthorize("@ss.hasPermi('monitor:job:edit')")
+    @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public R<?> edit(@RequestBody SysJob job) throws SchedulerException, TaskException
+    {
+        if (!CronUtils.isValid(job.getCronExpression()))
+        {
+            return R.fail("淇敼浠诲姟'" + job.getJobName() + "'澶辫触锛孋ron琛ㄨ揪寮忎笉姝g‘");
+        }
+        else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI))
+        {
+            return R.fail("淇敼浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅厑璁�'rmi'璋冪敤");
+        }
+        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS }))
+        {
+            return R.fail("淇敼浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅厑璁�'ldap(s)'璋冪敤");
+        }
+        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS }))
+        {
+            return R.fail("淇敼浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅厑璁�'http(s)'璋冪敤");
+        }
+        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR))
+        {
+            return R.fail("淇敼浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆瀛樺湪杩濊");
+        }
+        else if (!ScheduleUtils.whiteList(job.getInvokeTarget()))
+        {
+            return R.fail("淇敼浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅湪鐧藉悕鍗曞唴");
+        }
+        job.setUpdateBy(getUsername());
+        jobService.updateJob(job);
+        return R.ok();
+    }
+
+    /**
+     * 瀹氭椂浠诲姟鐘舵�佷慨鏀�
+     */
+    @PreAuthorize("@ss.hasPermi('monitor:job:changeStatus')")
+    @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.UPDATE)
+    @PutMapping("/changeStatus")
+    public R<?> changeStatus(@RequestBody SysJob job) throws SchedulerException
+    {
+        SysJob newJob = jobService.selectJobById(job.getJobId());
+        newJob.setStatus(job.getStatus());
+        jobService.changeStatus(newJob);
+        return R.ok();
+    }
+
+    /**
+     * 瀹氭椂浠诲姟绔嬪嵆鎵ц涓�娆�
+     */
+    @PreAuthorize("@ss.hasPermi('monitor:job:changeStatus')")
+    @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.UPDATE)
+    @PutMapping("/run")
+    public R<?> run(@RequestBody SysJob job) throws SchedulerException
+    {
+        boolean result = jobService.run(job);
+        return result ? R.ok() : R.fail("浠诲姟涓嶅瓨鍦ㄦ垨宸茶繃鏈燂紒");
+    }
+
+    /**
+     * 鍒犻櫎瀹氭椂浠诲姟
+     */
+    @PreAuthorize("@ss.hasPermi('monitor:job:remove')")
+    @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{jobIds}")
+    public R<?> remove(@PathVariable Long[] jobIds) throws SchedulerException
+    {
+        jobService.deleteJobByIds(jobIds);
+        return R.ok();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/project/monitor/controller/SysJobLogController.java b/src/main/java/com/ruoyi/project/monitor/controller/SysJobLogController.java
index 0c29d22..a15344d 100644
--- a/src/main/java/com/ruoyi/project/monitor/controller/SysJobLogController.java
+++ b/src/main/java/com/ruoyi/project/monitor/controller/SysJobLogController.java
@@ -1,93 +1,93 @@
-package com.ruoyi.project.monitor.controller;
-
-import java.util.List;
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.AllArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.framework.aspectj.lang.annotation.Log;
-import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
-import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.framework.web.page.TableDataInfo;
-import com.ruoyi.project.monitor.domain.SysJobLog;
-import com.ruoyi.project.monitor.service.ISysJobLogService;
-
-/**
- * 璋冨害鏃ュ織鎿嶄綔澶勭悊
- * 
- * @author ruoyi
- */
-@RestController
-@RequestMapping("/monitor/jobLog")
-@AllArgsConstructor
-public class SysJobLogController extends BaseController
-{
-    private ISysJobLogService jobLogService;
-
-    /**
-     * 鏌ヨ瀹氭椂浠诲姟璋冨害鏃ュ織鍒楄〃
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(SysJobLog sysJobLog)
-    {
-        startPage();
-        List<SysJobLog> list = jobLogService.selectJobLogList(sysJobLog);
-        return getDataTable(list);
-    }
-
-    /**
-     * 瀵煎嚭瀹氭椂浠诲姟璋冨害鏃ュ織鍒楄〃
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:export')")
-    @Log(title = "浠诲姟璋冨害鏃ュ織", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(HttpServletResponse response, SysJobLog sysJobLog)
-    {
-        List<SysJobLog> list = jobLogService.selectJobLogList(sysJobLog);
-        ExcelUtil<SysJobLog> util = new ExcelUtil<SysJobLog>(SysJobLog.class);
-        util.exportExcel(response, list, "璋冨害鏃ュ織");
-    }
-    
-    /**
-     * 鏍规嵁璋冨害缂栧彿鑾峰彇璇︾粏淇℃伅
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:query')")
-    @GetMapping(value = "/{jobLogId}")
-    public AjaxResult getInfo(@PathVariable Long jobLogId)
-    {
-        return success(jobLogService.selectJobLogById(jobLogId));
-    }
-
-
-    /**
-     * 鍒犻櫎瀹氭椂浠诲姟璋冨害鏃ュ織
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:remove')")
-    @Log(title = "瀹氭椂浠诲姟璋冨害鏃ュ織", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{jobLogIds}")
-    public AjaxResult remove(@PathVariable Long[] jobLogIds)
-    {
-        return toAjax(jobLogService.deleteJobLogByIds(jobLogIds));
-    }
-
-    /**
-     * 娓呯┖瀹氭椂浠诲姟璋冨害鏃ュ織
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:remove')")
-    @Log(title = "璋冨害鏃ュ織", businessType = BusinessType.CLEAN)
-    @DeleteMapping("/clean")
-    public AjaxResult clean()
-    {
-        jobLogService.cleanJobLog();
-        return success();
-    }
-}
+package com.ruoyi.project.monitor.controller;
+
+import java.util.List;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+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.framework.web.page.TableDataInfo;
+import com.ruoyi.project.monitor.domain.SysJobLog;
+import com.ruoyi.project.monitor.service.ISysJobLogService;
+import org.springframework.security.access.prepost.PreAuthorize;
+
+/**
+ * 璋冨害鏃ュ織鎿嶄綔澶勭悊
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/monitor/jobLog")
+@AllArgsConstructor
+public class SysJobLogController extends BaseController
+{
+    private ISysJobLogService jobLogService;
+
+    /**
+     * 鏌ヨ瀹氭椂浠诲姟璋冨害鏃ュ織鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('monitor:job:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysJobLog sysJobLog)
+    {
+        startPage();
+        List<SysJobLog> list = jobLogService.selectJobLogList(sysJobLog);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭瀹氭椂浠诲姟璋冨害鏃ュ織鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('monitor:job:export')")
+    @Log(title = "浠诲姟璋冨害鏃ュ織", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, SysJobLog sysJobLog)
+    {
+        List<SysJobLog> list = jobLogService.selectJobLogList(sysJobLog);
+        ExcelUtil<SysJobLog> util = new ExcelUtil<SysJobLog>(SysJobLog.class);
+        util.exportExcel(response, list, "璋冨害鏃ュ織");
+    }
+
+    /**
+     * 鏍规嵁璋冨害缂栧彿鑾峰彇璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('monitor:job:query')")
+    @GetMapping(value = "/{jobLogId}")
+    public R<?> getInfo(@PathVariable Long jobLogId)
+    {
+        return R.ok(jobLogService.selectJobLogById(jobLogId));
+    }
+
+
+    /**
+     * 鍒犻櫎瀹氭椂浠诲姟璋冨害鏃ュ織
+     */
+    @PreAuthorize("@ss.hasPermi('monitor:job:remove')")
+    @Log(title = "瀹氭椂浠诲姟璋冨害鏃ュ織", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{jobLogIds}")
+    public R<?> remove(@PathVariable Long[] jobLogIds)
+    {
+        jobLogService.deleteJobLogByIds(jobLogIds);
+        return R.ok();
+    }
+
+    /**
+     * 娓呯┖瀹氭椂浠诲姟璋冨害鏃ュ織
+     */
+    @PreAuthorize("@ss.hasPermi('monitor:job:remove')")
+    @Log(title = "璋冨害鏃ュ織", businessType = BusinessType.CLEAN)
+    @DeleteMapping("/clean")
+    public R<?> clean()
+    {
+        jobLogService.cleanJobLog();
+        return R.ok();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/project/monitor/controller/SysLogininforController.java b/src/main/java/com/ruoyi/project/monitor/controller/SysLogininforController.java
index 7f5085d..fb703ef 100644
--- a/src/main/java/com/ruoyi/project/monitor/controller/SysLogininforController.java
+++ b/src/main/java/com/ruoyi/project/monitor/controller/SysLogininforController.java
@@ -1,70 +1,71 @@
-package com.ruoyi.project.monitor.controller;
-
-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.service.SysPasswordService;
-import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.framework.web.page.TableDataInfo;
-import com.ruoyi.project.monitor.domain.SysLogininfor;
-import com.ruoyi.project.monitor.service.ISysLogininforService;
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.AllArgsConstructor;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-/**
- * 绯荤粺璁块棶璁板綍
- *
- * @author ruoyi
- */
-@RestController
-@RequestMapping("/monitor/logininfor")
-@AllArgsConstructor
-public class SysLogininforController extends BaseController {
-    private ISysLogininforService logininforService;
-    private SysPasswordService passwordService;
-
-    @PreAuthorize("@ss.hasPermi('monitor:logininfor:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(SysLogininfor logininfor) {
-        startPage();
-        List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
-        return getDataTable(list);
-    }
-
-    @Log(title = "鐧诲綍鏃ュ織", businessType = BusinessType.EXPORT)
-    @PreAuthorize("@ss.hasPermi('monitor:logininfor:export')")
-    @PostMapping("/export")
-    public void export(HttpServletResponse response, SysLogininfor logininfor) {
-        List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
-        ExcelUtil<SysLogininfor> util = new ExcelUtil<SysLogininfor>(SysLogininfor.class);
-        util.exportExcel(response, list, "鐧诲綍鏃ュ織");
-    }
-
-    @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
-    @Log(title = "鐧诲綍鏃ュ織", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{infoIds}")
-    public AjaxResult remove(@PathVariable Long[] infoIds) {
-        return toAjax(logininforService.deleteLogininforByIds(infoIds));
-    }
-
-    @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
-    @Log(title = "鐧诲綍鏃ュ織", businessType = BusinessType.CLEAN)
-    @DeleteMapping("/clean")
-    public AjaxResult clean() {
-        logininforService.cleanLogininfor();
-        return success();
-    }
-
-    @PreAuthorize("@ss.hasPermi('monitor:logininfor:unlock')")
-    @Log(title = "璐︽埛瑙i攣", businessType = BusinessType.OTHER)
-    @GetMapping("/unlock/{userName}")
-    public AjaxResult unlock(@PathVariable("userName") String userName) {
-        passwordService.clearLoginRecordCache(userName);
-        return success();
-    }
-}
+package com.ruoyi.project.monitor.controller;
+
+import com.ruoyi.framework.web.domain.R;
+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.service.SysPasswordService;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.page.TableDataInfo;
+import com.ruoyi.project.monitor.domain.SysLogininfor;
+import com.ruoyi.project.monitor.service.ISysLogininforService;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.AllArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 绯荤粺璁块棶璁板綍
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/monitor/logininfor")
+@AllArgsConstructor
+public class SysLogininforController extends BaseController {
+    private ISysLogininforService logininforService;
+    private SysPasswordService passwordService;
+
+    @PreAuthorize("@ss.hasPermi('monitor:logininfor:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysLogininfor logininfor) {
+        startPage();
+        List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
+        return getDataTable(list);
+    }
+
+    @Log(title = "鐧诲綍鏃ュ織", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('monitor:logininfor:export')")
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, SysLogininfor logininfor) {
+        List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
+        ExcelUtil<SysLogininfor> util = new ExcelUtil<SysLogininfor>(SysLogininfor.class);
+        util.exportExcel(response, list, "鐧诲綍鏃ュ織");
+    }
+
+    @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
+    @Log(title = "鐧诲綍鏃ュ織", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{infoIds}")
+    public R<?> remove(@PathVariable Long[] infoIds) {
+        logininforService.deleteLogininforByIds(infoIds);
+        return R.ok();
+    }
+
+    @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
+    @Log(title = "鐧诲綍鏃ュ織", businessType = BusinessType.CLEAN)
+    @DeleteMapping("/clean")
+    public R<?> clean() {
+        logininforService.cleanLogininfor();
+        return R.ok();
+    }
+
+    @PreAuthorize("@ss.hasPermi('monitor:logininfor:unlock')")
+    @Log(title = "璐︽埛瑙i攣", businessType = BusinessType.OTHER)
+    @GetMapping("/unlock/{userName}")
+    public R<?> unlock(@PathVariable("userName") String userName) {
+        passwordService.clearLoginRecordCache(userName);
+        return R.ok();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/project/monitor/controller/SysOperlogController.java b/src/main/java/com/ruoyi/project/monitor/controller/SysOperlogController.java
index 81bab02..ee36e80 100644
--- a/src/main/java/com/ruoyi/project/monitor/controller/SysOperlogController.java
+++ b/src/main/java/com/ruoyi/project/monitor/controller/SysOperlogController.java
@@ -1,70 +1,70 @@
-package com.ruoyi.project.monitor.controller;
-
-import java.util.List;
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.AllArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.framework.aspectj.lang.annotation.Log;
-import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
-import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.framework.web.page.TableDataInfo;
-import com.ruoyi.project.monitor.domain.SysOperLog;
-import com.ruoyi.project.monitor.service.ISysOperLogService;
-
-/**
- * 鎿嶄綔鏃ュ織璁板綍
- * 
- * @author ruoyi
- */
-@RestController
-@RequestMapping("/monitor/operlog")
-@AllArgsConstructor
-public class SysOperlogController extends BaseController
-{
-    private ISysOperLogService operLogService;
-
-    @PreAuthorize("@ss.hasPermi('monitor:operlog:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(SysOperLog operLog)
-    {
-        startPage();
-        List<SysOperLog> list = operLogService.selectOperLogList(operLog);
-        return getDataTable(list);
-    }
-
-    @Log(title = "鎿嶄綔鏃ュ織", businessType = BusinessType.EXPORT)
-    @PreAuthorize("@ss.hasPermi('monitor:operlog:export')")
-    @PostMapping("/export")
-    public void export(HttpServletResponse response, SysOperLog operLog)
-    {
-        List<SysOperLog> list = operLogService.selectOperLogList(operLog);
-        ExcelUtil<SysOperLog> util = new ExcelUtil<SysOperLog>(SysOperLog.class);
-        util.exportExcel(response, list, "鎿嶄綔鏃ュ織");
-    }
-
-    @Log(title = "鎿嶄綔鏃ュ織", businessType = BusinessType.DELETE)
-    @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
-    @DeleteMapping("/{operIds}")
-    public AjaxResult remove(@PathVariable Long[] operIds)
-    {
-        return toAjax(operLogService.deleteOperLogByIds(operIds));
-    }
-
-    @Log(title = "鎿嶄綔鏃ュ織", businessType = BusinessType.CLEAN)
-    @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
-    @DeleteMapping("/clean")
-    public AjaxResult clean()
-    {
-        operLogService.cleanOperLog();
-        return success();
-    }
-}
+package com.ruoyi.project.monitor.controller;
+
+import java.util.List;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.AllArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+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.framework.web.page.TableDataInfo;
+import com.ruoyi.project.monitor.domain.SysOperLog;
+import com.ruoyi.project.monitor.service.ISysOperLogService;
+
+/**
+ * 鎿嶄綔鏃ュ織璁板綍
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/monitor/operlog")
+@AllArgsConstructor
+public class SysOperlogController extends BaseController
+{
+    private ISysOperLogService operLogService;
+
+    @PreAuthorize("@ss.hasPermi('monitor:operlog:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysOperLog operLog)
+    {
+        startPage();
+        List<SysOperLog> list = operLogService.selectOperLogList(operLog);
+        return getDataTable(list);
+    }
+
+    @Log(title = "鎿嶄綔鏃ュ織", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('monitor:operlog:export')")
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, SysOperLog operLog)
+    {
+        List<SysOperLog> list = operLogService.selectOperLogList(operLog);
+        ExcelUtil<SysOperLog> util = new ExcelUtil<SysOperLog>(SysOperLog.class);
+        util.exportExcel(response, list, "鎿嶄綔鏃ュ織");
+    }
+
+    @Log(title = "鎿嶄綔鏃ュ織", businessType = BusinessType.DELETE)
+    @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
+    @DeleteMapping("/{operIds}")
+    public R<?> remove(@PathVariable Long[] operIds)
+    {
+        operLogService.deleteOperLogByIds(operIds);
+        return R.ok();
+    }
+
+    @Log(title = "鎿嶄綔鏃ュ織", businessType = BusinessType.CLEAN)
+    @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
+    @DeleteMapping("/clean")
+    public R<?> clean()
+    {
+        operLogService.cleanOperLog();
+        return R.ok();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/project/monitor/controller/SysUserOnlineController.java b/src/main/java/com/ruoyi/project/monitor/controller/SysUserOnlineController.java
index aa8c824..666a6c0 100644
--- a/src/main/java/com/ruoyi/project/monitor/controller/SysUserOnlineController.java
+++ b/src/main/java/com/ruoyi/project/monitor/controller/SysUserOnlineController.java
@@ -1,83 +1,82 @@
-package com.ruoyi.project.monitor.controller;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import lombok.AllArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import com.ruoyi.common.constant.CacheConstants;
-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.redis.RedisCache;
-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.page.TableDataInfo;
-import com.ruoyi.project.monitor.domain.SysUserOnline;
-import com.ruoyi.project.system.service.ISysUserOnlineService;
-
-/**
- * 鍦ㄧ嚎鐢ㄦ埛鐩戞帶
- * 
- * @author ruoyi
- */
-@RestController
-@RequestMapping("/monitor/online")
-@AllArgsConstructor
-public class SysUserOnlineController extends BaseController
-{
-    private ISysUserOnlineService userOnlineService;
-    private RedisCache redisCache;
-
-    @PreAuthorize("@ss.hasPermi('monitor:online:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(String ipaddr, String userName)
-    {
-        Collection<String> keys = redisCache.keys(CacheConstants.LOGIN_TOKEN_KEY + "*");
-        List<SysUserOnline> userOnlineList = new ArrayList<SysUserOnline>();
-        for (String key : keys)
-        {
-            LoginUser user = redisCache.getCacheObject(key);
-            if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName))
-            {
-                userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user));
-            }
-            else if (StringUtils.isNotEmpty(ipaddr))
-            {
-                userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user));
-            }
-            else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser()))
-            {
-                userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user));
-            }
-            else
-            {
-                userOnlineList.add(userOnlineService.loginUserToUserOnline(user));
-            }
-        }
-        Collections.reverse(userOnlineList);
-        userOnlineList.removeAll(Collections.singleton(null));
-        return getDataTable(userOnlineList);
-    }
-
-    /**
-     * 寮洪��鐢ㄦ埛
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')")
-    @Log(title = "鍦ㄧ嚎鐢ㄦ埛", businessType = BusinessType.FORCE)
-    @DeleteMapping("/{tokenId}")
-    public AjaxResult forceLogout(@PathVariable String tokenId)
-    {
-        redisCache.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + tokenId);
-        return success();
-    }
-}
+package com.ruoyi.project.monitor.controller;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import com.ruoyi.framework.web.domain.R;
+import lombok.AllArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.constant.CacheConstants;
+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.redis.RedisCache;
+import com.ruoyi.framework.security.LoginUser;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.page.TableDataInfo;
+import com.ruoyi.project.monitor.domain.SysUserOnline;
+import com.ruoyi.project.system.service.ISysUserOnlineService;
+
+/**
+ * 鍦ㄧ嚎鐢ㄦ埛鐩戞帶
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/monitor/online")
+@AllArgsConstructor
+public class SysUserOnlineController extends BaseController
+{
+    private ISysUserOnlineService userOnlineService;
+    private RedisCache redisCache;
+
+    @PreAuthorize("@ss.hasPermi('monitor:online:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(String ipaddr, String userName)
+    {
+        Collection<String> keys = redisCache.keys(CacheConstants.LOGIN_TOKEN_KEY + "*");
+        List<SysUserOnline> userOnlineList = new ArrayList<SysUserOnline>();
+        for (String key : keys)
+        {
+            LoginUser user = redisCache.getCacheObject(key);
+            if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName))
+            {
+                userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user));
+            }
+            else if (StringUtils.isNotEmpty(ipaddr))
+            {
+                userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user));
+            }
+            else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser()))
+            {
+                userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user));
+            }
+            else
+            {
+                userOnlineList.add(userOnlineService.loginUserToUserOnline(user));
+            }
+        }
+        Collections.reverse(userOnlineList);
+        userOnlineList.removeAll(Collections.singleton(null));
+        return getDataTable(userOnlineList);
+    }
+
+    /**
+     * 寮洪��鐢ㄦ埛
+     */
+    @PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')")
+    @Log(title = "鍦ㄧ嚎鐢ㄦ埛", businessType = BusinessType.FORCE)
+    @DeleteMapping("/{tokenId}")
+    public R<?> forceLogout(@PathVariable String tokenId)
+    {
+        redisCache.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + tokenId);
+        return R.ok();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/project/system/controller/SysConfigController.java b/src/main/java/com/ruoyi/project/system/controller/SysConfigController.java
index a10687b..62f646d 100644
--- a/src/main/java/com/ruoyi/project/system/controller/SysConfigController.java
+++ b/src/main/java/com/ruoyi/project/system/controller/SysConfigController.java
@@ -1,127 +1,129 @@
-package com.ruoyi.project.system.controller;
-
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.framework.aspectj.lang.annotation.Log;
-import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
-import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.framework.web.page.TableDataInfo;
-import com.ruoyi.project.system.domain.SysConfig;
-import com.ruoyi.project.system.service.ISysConfigService;
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.AllArgsConstructor;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-/**
- * 鍙傛暟閰嶇疆 淇℃伅鎿嶄綔澶勭悊
- * 
- * @author ruoyi
- */
-@RestController
-@RequestMapping("/system/config")
-@AllArgsConstructor
-public class SysConfigController extends BaseController
-{
-    private ISysConfigService configService;
-
-    /**
-     * 鑾峰彇鍙傛暟閰嶇疆鍒楄〃
-     */
-    @PreAuthorize("@ss.hasPermi('system:config:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(SysConfig config)
-    {
-        startPage();
-        List<SysConfig> list = configService.selectConfigList(config);
-        return getDataTable(list);
-    }
-
-    @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.EXPORT)
-    @PreAuthorize("@ss.hasPermi('system:config:export')")
-    @PostMapping("/export")
-    public void export(HttpServletResponse response, SysConfig config)
-    {
-        List<SysConfig> list = configService.selectConfigList(config);
-        ExcelUtil<SysConfig> util = new ExcelUtil<SysConfig>(SysConfig.class);
-        util.exportExcel(response, list, "鍙傛暟鏁版嵁");
-    }
-
-    /**
-     * 鏍规嵁鍙傛暟缂栧彿鑾峰彇璇︾粏淇℃伅
-     */
-    @PreAuthorize("@ss.hasPermi('system:config:query')")
-    @GetMapping(value = "/{configId}")
-    public AjaxResult getInfo(@PathVariable Long configId)
-    {
-        return success(configService.selectConfigById(configId));
-    }
-
-    /**
-     * 鏍规嵁鍙傛暟閿悕鏌ヨ鍙傛暟鍊�
-     */
-    @GetMapping(value = "/configKey/{configKey}")
-    public AjaxResult getConfigKey(@PathVariable String configKey)
-    {
-        return success(configService.selectConfigByKey(configKey));
-    }
-
-    /**
-     * 鏂板鍙傛暟閰嶇疆
-     */
-    @PreAuthorize("@ss.hasPermi('system:config:add')")
-    @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.INSERT)
-    @PostMapping
-    public AjaxResult add(@Validated @RequestBody SysConfig config)
-    {
-        if (!configService.checkConfigKeyUnique(config))
-        {
-            return error("鏂板鍙傛暟'" + config.getConfigName() + "'澶辫触锛屽弬鏁伴敭鍚嶅凡瀛樺湪");
-        }
-        config.setCreateBy(getUsername());
-        return toAjax(configService.insertConfig(config));
-    }
-
-    /**
-     * 淇敼鍙傛暟閰嶇疆
-     */
-    @PreAuthorize("@ss.hasPermi('system:config:edit')")
-    @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult edit(@Validated @RequestBody SysConfig config)
-    {
-        if (!configService.checkConfigKeyUnique(config))
-        {
-            return error("淇敼鍙傛暟'" + config.getConfigName() + "'澶辫触锛屽弬鏁伴敭鍚嶅凡瀛樺湪");
-        }
-        config.setUpdateBy(getUsername());
-        return toAjax(configService.updateConfig(config));
-    }
-
-    /**
-     * 鍒犻櫎鍙傛暟閰嶇疆
-     */
-    @PreAuthorize("@ss.hasPermi('system:config:remove')")
-    @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{configIds}")
-    public AjaxResult remove(@PathVariable Long[] configIds)
-    {
-        configService.deleteConfigByIds(configIds);
-        return success();
-    }
-
-    /**
-     * 鍒锋柊鍙傛暟缂撳瓨
-     */
-    @PreAuthorize("@ss.hasPermi('system:config:remove')")
-    @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.CLEAN)
-    @DeleteMapping("/refreshCache")
-    public AjaxResult refreshCache()
-    {
-        configService.resetConfigCache();
-        return success();
-    }
-}
+package com.ruoyi.project.system.controller;
+
+import java.util.List;
+
+import com.ruoyi.framework.web.domain.R;
+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.page.TableDataInfo;
+import com.ruoyi.project.system.domain.SysConfig;
+import com.ruoyi.project.system.service.ISysConfigService;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.AllArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 鍙傛暟閰嶇疆 淇℃伅鎿嶄綔澶勭悊
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/system/config")
+@AllArgsConstructor
+public class SysConfigController extends BaseController
+{
+    private ISysConfigService configService;
+
+    /**
+     * 鑾峰彇鍙傛暟閰嶇疆鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('system:config:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysConfig config)
+    {
+        startPage();
+        List<SysConfig> list = configService.selectConfigList(config);
+        return getDataTable(list);
+    }
+
+    @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('system:config:export')")
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, SysConfig config)
+    {
+        List<SysConfig> list = configService.selectConfigList(config);
+        ExcelUtil<SysConfig> util = new ExcelUtil<SysConfig>(SysConfig.class);
+        util.exportExcel(response, list, "鍙傛暟鏁版嵁");
+    }
+
+    /**
+     * 鏍规嵁鍙傛暟缂栧彿鑾峰彇璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('system:config:query')")
+    @GetMapping(value = "/{configId}")
+    public R<?> getInfo(@PathVariable Long configId)
+    {
+        return R.ok(configService.selectConfigById(configId));
+    }
+
+    /**
+     * 鏍规嵁鍙傛暟閿悕鏌ヨ鍙傛暟鍊�
+     */
+    @GetMapping(value = "/configKey/{configKey}")
+    public R<?> getConfigKey(@PathVariable String configKey)
+    {
+        return R.ok(configService.selectConfigByKey(configKey));
+    }
+
+    /**
+     * 鏂板鍙傛暟閰嶇疆
+     */
+    @PreAuthorize("@ss.hasPermi('system:config:add')")
+    @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.INSERT)
+    @PostMapping
+    public R<?> add(@Validated @RequestBody SysConfig config)
+    {
+        if (!configService.checkConfigKeyUnique(config))
+        {
+            return R.fail("鏂板鍙傛暟'" + config.getConfigName() + "'澶辫触锛屽弬鏁伴敭鍚嶅凡瀛樺湪");
+        }
+        config.setCreateBy(getUsername());
+        configService.insertConfig(config);
+        return R.ok();
+    }
+
+    /**
+     * 淇敼鍙傛暟閰嶇疆
+     */
+    @PreAuthorize("@ss.hasPermi('system:config:edit')")
+    @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public R<?> edit(@Validated @RequestBody SysConfig config)
+    {
+        if (!configService.checkConfigKeyUnique(config))
+        {
+            return R.fail("淇敼鍙傛暟'" + config.getConfigName() + "'澶辫触锛屽弬鏁伴敭鍚嶅凡瀛樺湪");
+        }
+        config.setUpdateBy(getUsername());
+        configService.updateConfig(config);
+        return R.ok();
+    }
+
+    /**
+     * 鍒犻櫎鍙傛暟閰嶇疆
+     */
+    @PreAuthorize("@ss.hasPermi('system:config:remove')")
+    @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{configIds}")
+    public R<?> remove(@PathVariable Long[] configIds)
+    {
+        configService.deleteConfigByIds(configIds);
+        return R.ok();
+    }
+
+    /**
+     * 鍒锋柊鍙傛暟缂撳瓨
+     */
+    @PreAuthorize("@ss.hasPermi('system:config:remove')")
+    @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.CLEAN)
+    @DeleteMapping("/refreshCache")
+    public R<?> refreshCache()
+    {
+        configService.resetConfigCache();
+        return R.ok();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/project/system/controller/SysDeptController.java b/src/main/java/com/ruoyi/project/system/controller/SysDeptController.java
index f61e42f..bb0da7b 100644
--- a/src/main/java/com/ruoyi/project/system/controller/SysDeptController.java
+++ b/src/main/java/com/ruoyi/project/system/controller/SysDeptController.java
@@ -1,134 +1,137 @@
-package com.ruoyi.project.system.controller;
-
-import java.util.List;
-
-import lombok.AllArgsConstructor;
-import org.apache.commons.lang3.ArrayUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-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.constant.UserConstants;
-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.AjaxResult;
-import com.ruoyi.project.system.domain.SysDept;
-import com.ruoyi.project.system.service.ISysDeptService;
-
-/**
- * 閮ㄩ棬淇℃伅
- * 
- * @author ruoyi
- */
-@RestController
-@RequestMapping("/system/dept")
-@AllArgsConstructor
-public class SysDeptController extends BaseController
-{
-    private ISysDeptService deptService;
-
-    /**
-     * 鑾峰彇閮ㄩ棬鍒楄〃
-     */
-    @PreAuthorize("@ss.hasPermi('system:dept:list')")
-    @GetMapping("/list")
-    public AjaxResult list(SysDept dept)
-    {
-        List<SysDept> depts = deptService.selectDeptList(dept);
-        return success(depts);
-    }
-
-    /**
-     * 鏌ヨ閮ㄩ棬鍒楄〃锛堟帓闄よ妭鐐癸級
-     */
-    @PreAuthorize("@ss.hasPermi('system:dept:list')")
-    @GetMapping("/list/exclude/{deptId}")
-    public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId)
-    {
-        List<SysDept> depts = deptService.selectDeptList(new SysDept());
-        depts.removeIf(d -> d.getDeptId().intValue() == deptId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + ""));
-        return success(depts);
-    }
-
-    /**
-     * 鏍规嵁閮ㄩ棬缂栧彿鑾峰彇璇︾粏淇℃伅
-     */
-    @PreAuthorize("@ss.hasPermi('system:dept:query')")
-    @GetMapping(value = "/{deptId}")
-    public AjaxResult getInfo(@PathVariable Long deptId)
-    {
-        deptService.checkDeptDataScope(deptId);
-        return success(deptService.selectDeptById(deptId));
-    }
-
-    /**
-     * 鏂板閮ㄩ棬
-     */
-    @PreAuthorize("@ss.hasPermi('system:dept:add')")
-    @Log(title = "閮ㄩ棬绠$悊", businessType = BusinessType.INSERT)
-    @PostMapping
-    public AjaxResult add(@Validated @RequestBody SysDept dept)
-    {
-        if (!deptService.checkDeptNameUnique(dept))
-        {
-            return error("鏂板閮ㄩ棬'" + dept.getDeptName() + "'澶辫触锛岄儴闂ㄥ悕绉板凡瀛樺湪");
-        }
-        dept.setCreateBy(getUsername());
-        return toAjax(deptService.insertDept(dept));
-    }
-
-    /**
-     * 淇敼閮ㄩ棬
-     */
-    @PreAuthorize("@ss.hasPermi('system:dept:edit')")
-    @Log(title = "閮ㄩ棬绠$悊", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult edit(@Validated @RequestBody SysDept dept)
-    {
-        Long deptId = dept.getDeptId();
-        deptService.checkDeptDataScope(deptId);
-        if (!deptService.checkDeptNameUnique(dept))
-        {
-            return error("淇敼閮ㄩ棬'" + dept.getDeptName() + "'澶辫触锛岄儴闂ㄥ悕绉板凡瀛樺湪");
-        }
-        else if (dept.getParentId().equals(deptId))
-        {
-            return error("淇敼閮ㄩ棬'" + dept.getDeptName() + "'澶辫触锛屼笂绾ч儴闂ㄤ笉鑳芥槸鑷繁");
-        }
-        else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && deptService.selectNormalChildrenDeptById(deptId) > 0)
-        {
-            return error("璇ラ儴闂ㄥ寘鍚湭鍋滅敤鐨勫瓙閮ㄩ棬锛�");
-        }
-        dept.setUpdateBy(getUsername());
-        return toAjax(deptService.updateDept(dept));
-    }
-
-    /**
-     * 鍒犻櫎閮ㄩ棬
-     */
-    @PreAuthorize("@ss.hasPermi('system:dept:remove')")
-    @Log(title = "閮ㄩ棬绠$悊", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{deptId}")
-    public AjaxResult remove(@PathVariable Long deptId)
-    {
-        if (deptService.hasChildByDeptId(deptId))
-        {
-            return warn("瀛樺湪涓嬬骇閮ㄩ棬,涓嶅厑璁稿垹闄�");
-        }
-        if (deptService.checkDeptExistUser(deptId))
-        {
-            return warn("閮ㄩ棬瀛樺湪鐢ㄦ埛,涓嶅厑璁稿垹闄�");
-        }
-        deptService.checkDeptDataScope(deptId);
-        return toAjax(deptService.deleteDeptById(deptId));
-    }
-}
+package com.ruoyi.project.system.controller;
+
+import java.util.List;
+
+import com.ruoyi.common.constant.HttpStatus;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.ArrayUtils;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+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.constant.UserConstants;
+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 com.ruoyi.project.system.domain.SysDept;
+import com.ruoyi.project.system.service.ISysDeptService;
+
+/**
+ * 閮ㄩ棬淇℃伅
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/system/dept")
+@AllArgsConstructor
+public class SysDeptController extends BaseController
+{
+    private ISysDeptService deptService;
+
+    /**
+     * 鑾峰彇閮ㄩ棬鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('system:dept:list')")
+    @GetMapping("/list")
+    public R<?> list(SysDept dept)
+    {
+        List<SysDept> depts = deptService.selectDeptList(dept);
+        return R.ok(depts);
+    }
+
+    /**
+     * 鏌ヨ閮ㄩ棬鍒楄〃锛堟帓闄よ妭鐐癸級
+     */
+    @PreAuthorize("@ss.hasPermi('system:dept:list')")
+    @GetMapping("/list/exclude/{deptId}")
+    public R<?> excludeChild(@PathVariable(value = "deptId", required = false) Long deptId)
+    {
+        List<SysDept> depts = deptService.selectDeptList(new SysDept());
+        depts.removeIf(d -> d.getDeptId().intValue() == deptId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + ""));
+        return R.ok(depts);
+    }
+
+    /**
+     * 鏍规嵁閮ㄩ棬缂栧彿鑾峰彇璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('system:dept:query')")
+    @GetMapping(value = "/{deptId}")
+    public R<?> getInfo(@PathVariable Long deptId)
+    {
+        deptService.checkDeptDataScope(deptId);
+        return R.ok(deptService.selectDeptById(deptId));
+    }
+
+    /**
+     * 鏂板閮ㄩ棬
+     */
+    @PreAuthorize("@ss.hasPermi('system:dept:add')")
+    @Log(title = "閮ㄩ棬绠$悊", businessType = BusinessType.INSERT)
+    @PostMapping
+    public R<?> add(@Validated @RequestBody SysDept dept)
+    {
+        if (!deptService.checkDeptNameUnique(dept))
+        {
+            return R.fail("鏂板閮ㄩ棬'" + dept.getDeptName() + "'澶辫触锛岄儴闂ㄥ悕绉板凡瀛樺湪");
+        }
+        dept.setCreateBy(getUsername());
+        deptService.insertDept(dept);
+        return R.ok();
+    }
+
+    /**
+     * 淇敼閮ㄩ棬
+     */
+    @PreAuthorize("@ss.hasPermi('system:dept:edit')")
+    @Log(title = "閮ㄩ棬绠$悊", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public R<?> edit(@Validated @RequestBody SysDept dept)
+    {
+        Long deptId = dept.getDeptId();
+        deptService.checkDeptDataScope(deptId);
+        if (!deptService.checkDeptNameUnique(dept))
+        {
+            return R.fail("淇敼閮ㄩ棬'" + dept.getDeptName() + "'澶辫触锛岄儴闂ㄥ悕绉板凡瀛樺湪");
+        }
+        else if (dept.getParentId().equals(deptId))
+        {
+            return R.fail("淇敼閮ㄩ棬'" + dept.getDeptName() + "'澶辫触锛屼笂绾ч儴闂ㄤ笉鑳芥槸鑷繁");
+        }
+        else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && deptService.selectNormalChildrenDeptById(deptId) > 0)
+        {
+            return R.fail("璇ラ儴闂ㄥ寘鍚湭鍋滅敤鐨勫瓙閮ㄩ棬锛�");
+        }
+        dept.setUpdateBy(getUsername());
+        deptService.updateDept(dept);
+        return R.ok();
+    }
+
+    /**
+     * 鍒犻櫎閮ㄩ棬
+     */
+    @PreAuthorize("@ss.hasPermi('system:dept:remove')")
+    @Log(title = "閮ㄩ棬绠$悊", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{deptId}")
+    public R<?> remove(@PathVariable Long deptId)
+    {
+        if (deptService.hasChildByDeptId(deptId))
+        {
+            return R.fail(HttpStatus.WARN, "瀛樺湪涓嬬骇閮ㄩ棬,涓嶅厑璁稿垹闄�");
+        }
+        if (deptService.checkDeptExistUser(deptId))
+        {
+            return R.fail(HttpStatus.WARN, "閮ㄩ棬瀛樺湪鐢ㄦ埛,涓嶅厑璁稿垹闄�");
+        }
+        deptService.checkDeptDataScope(deptId);
+        deptService.deleteDeptById(deptId);
+        return R.ok();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/project/system/controller/SysDictDataController.java b/src/main/java/com/ruoyi/project/system/controller/SysDictDataController.java
index 58cb4c1..66220e5 100644
--- a/src/main/java/com/ruoyi/project/system/controller/SysDictDataController.java
+++ b/src/main/java/com/ruoyi/project/system/controller/SysDictDataController.java
@@ -1,120 +1,121 @@
-package com.ruoyi.project.system.controller;
-
-import java.util.ArrayList;
-import java.util.List;
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.AllArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-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.common.utils.poi.ExcelUtil;
-import com.ruoyi.framework.aspectj.lang.annotation.Log;
-import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
-import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.framework.web.page.TableDataInfo;
-import com.ruoyi.project.system.domain.SysDictData;
-import com.ruoyi.project.system.service.ISysDictDataService;
-import com.ruoyi.project.system.service.ISysDictTypeService;
-
-/**
- * 鏁版嵁瀛楀吀淇℃伅
- * 
- * @author ruoyi
- */
-@RestController
-@RequestMapping("/system/dict/data")
-@AllArgsConstructor
-public class SysDictDataController extends BaseController
-{
-    private ISysDictDataService dictDataService;
-    private ISysDictTypeService dictTypeService;
-
-    @PreAuthorize("@ss.hasPermi('system:dict:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(SysDictData dictData)
-    {
-        startPage();
-        List<SysDictData> list = dictDataService.selectDictDataList(dictData);
-        return getDataTable(list);
-    }
-
-    @Log(title = "瀛楀吀鏁版嵁", businessType = BusinessType.EXPORT)
-    @PreAuthorize("@ss.hasPermi('system:dict:export')")
-    @PostMapping("/export")
-    public void export(HttpServletResponse response, SysDictData dictData)
-    {
-        List<SysDictData> list = dictDataService.selectDictDataList(dictData);
-        ExcelUtil<SysDictData> util = new ExcelUtil<SysDictData>(SysDictData.class);
-        util.exportExcel(response, list, "瀛楀吀鏁版嵁");
-    }
-
-    /**
-     * 鏌ヨ瀛楀吀鏁版嵁璇︾粏
-     */
-    @PreAuthorize("@ss.hasPermi('system:dict:query')")
-    @GetMapping(value = "/{dictCode}")
-    public AjaxResult getInfo(@PathVariable Long dictCode)
-    {
-        return success(dictDataService.selectDictDataById(dictCode));
-    }
-
-    /**
-     * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁淇℃伅
-     */
-    @GetMapping(value = "/type/{dictType}")
-    public AjaxResult dictType(@PathVariable String dictType)
-    {
-        List<SysDictData> data = dictTypeService.selectDictDataByType(dictType);
-        if (StringUtils.isNull(data))
-        {
-            data = new ArrayList<SysDictData>();
-        }
-        return success(data);
-    }
-
-    /**
-     * 鏂板瀛楀吀绫诲瀷
-     */
-    @PreAuthorize("@ss.hasPermi('system:dict:add')")
-    @Log(title = "瀛楀吀鏁版嵁", businessType = BusinessType.INSERT)
-    @PostMapping
-    public AjaxResult add(@Validated @RequestBody SysDictData dict)
-    {
-        dict.setCreateBy(getUsername());
-        return toAjax(dictDataService.insertDictData(dict));
-    }
-
-    /**
-     * 淇敼淇濆瓨瀛楀吀绫诲瀷
-     */
-    @PreAuthorize("@ss.hasPermi('system:dict:edit')")
-    @Log(title = "瀛楀吀鏁版嵁", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult edit(@Validated @RequestBody SysDictData dict)
-    {
-        dict.setUpdateBy(getUsername());
-        return toAjax(dictDataService.updateDictData(dict));
-    }
-
-    /**
-     * 鍒犻櫎瀛楀吀绫诲瀷
-     */
-    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
-    @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{dictCodes}")
-    public AjaxResult remove(@PathVariable Long[] dictCodes)
-    {
-        dictDataService.deleteDictDataByIds(dictCodes);
-        return success();
-    }
-}
+package com.ruoyi.project.system.controller;
+
+import java.util.ArrayList;
+import java.util.List;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.AllArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+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.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.framework.web.page.TableDataInfo;
+import com.ruoyi.project.system.domain.SysDictData;
+import com.ruoyi.project.system.service.ISysDictDataService;
+import com.ruoyi.project.system.service.ISysDictTypeService;
+
+/**
+ * 鏁版嵁瀛楀吀淇℃伅
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/system/dict/data")
+@AllArgsConstructor
+public class SysDictDataController extends BaseController
+{
+    private ISysDictDataService dictDataService;
+    private ISysDictTypeService dictTypeService;
+
+    @PreAuthorize("@ss.hasPermi('system:dict:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysDictData dictData)
+    {
+        startPage();
+        List<SysDictData> list = dictDataService.selectDictDataList(dictData);
+        return getDataTable(list);
+    }
+
+    @Log(title = "瀛楀吀鏁版嵁", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('system:dict:export')")
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, SysDictData dictData)
+    {
+        List<SysDictData> list = dictDataService.selectDictDataList(dictData);
+        ExcelUtil<SysDictData> util = new ExcelUtil<SysDictData>(SysDictData.class);
+        util.exportExcel(response, list, "瀛楀吀鏁版嵁");
+    }
+
+    /**
+     * 鏌ヨ瀛楀吀鏁版嵁璇︾粏
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:query')")
+    @GetMapping(value = "/{dictCode}")
+    public R<?> getInfo(@PathVariable Long dictCode)
+    {
+        return R.ok(dictDataService.selectDictDataById(dictCode));
+    }
+
+    /**
+     * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁淇℃伅
+     */
+    @GetMapping(value = "/type/{dictType}")
+    public R<?> dictType(@PathVariable String dictType)
+    {
+        List<SysDictData> data = dictTypeService.selectDictDataByType(dictType);
+        if (StringUtils.isNull(data))
+        {
+            data = new ArrayList<SysDictData>();
+        }
+        return R.ok(data);
+    }
+
+    /**
+     * 鏂板瀛楀吀绫诲瀷
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:add')")
+    @Log(title = "瀛楀吀鏁版嵁", businessType = BusinessType.INSERT)
+    @PostMapping
+    public R<?> add(@Validated @RequestBody SysDictData dict)
+    {
+        dict.setCreateBy(getUsername());
+        dictDataService.insertDictData(dict);
+        return R.ok();
+    }
+
+    /**
+     * 淇敼淇濆瓨瀛楀吀绫诲瀷
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:edit')")
+    @Log(title = "瀛楀吀鏁版嵁", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public R<?> edit(@Validated @RequestBody SysDictData dict)
+    {
+        dict.setUpdateBy(getUsername());
+        dictDataService.updateDictData(dict);
+        return R.ok();
+    }
+
+    /**
+     * 鍒犻櫎瀛楀吀绫诲瀷
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
+    @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{dictCodes}")
+    public R<?> remove(@PathVariable Long[] dictCodes)
+    {
+        dictDataService.deleteDictDataByIds(dictCodes);
+        return R.ok();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/project/system/controller/SysDictTypeController.java b/src/main/java/com/ruoyi/project/system/controller/SysDictTypeController.java
index f1a026f..4415c0c 100644
--- a/src/main/java/com/ruoyi/project/system/controller/SysDictTypeController.java
+++ b/src/main/java/com/ruoyi/project/system/controller/SysDictTypeController.java
@@ -1,132 +1,133 @@
-package com.ruoyi.project.system.controller;
-
-import java.util.List;
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.AllArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-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.poi.ExcelUtil;
-import com.ruoyi.framework.aspectj.lang.annotation.Log;
-import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
-import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.framework.web.page.TableDataInfo;
-import com.ruoyi.project.system.domain.SysDictType;
-import com.ruoyi.project.system.service.ISysDictTypeService;
-
-/**
- * 鏁版嵁瀛楀吀淇℃伅
- * 
- * @author ruoyi
- */
-@RestController
-@RequestMapping("/system/dict/type")
-@AllArgsConstructor
-public class SysDictTypeController extends BaseController
-{
-    private ISysDictTypeService dictTypeService;
-
-    @PreAuthorize("@ss.hasPermi('system:dict:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(SysDictType dictType)
-    {
-        startPage();
-        List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
-        return getDataTable(list);
-    }
-
-    @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.EXPORT)
-    @PreAuthorize("@ss.hasPermi('system:dict:export')")
-    @PostMapping("/export")
-    public void export(HttpServletResponse response, SysDictType dictType)
-    {
-        List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
-        ExcelUtil<SysDictType> util = new ExcelUtil<SysDictType>(SysDictType.class);
-        util.exportExcel(response, list, "瀛楀吀绫诲瀷");
-    }
-
-    /**
-     * 鏌ヨ瀛楀吀绫诲瀷璇︾粏
-     */
-    @PreAuthorize("@ss.hasPermi('system:dict:query')")
-    @GetMapping(value = "/{dictId}")
-    public AjaxResult getInfo(@PathVariable Long dictId)
-    {
-        return success(dictTypeService.selectDictTypeById(dictId));
-    }
-
-    /**
-     * 鏂板瀛楀吀绫诲瀷
-     */
-    @PreAuthorize("@ss.hasPermi('system:dict:add')")
-    @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.INSERT)
-    @PostMapping
-    public AjaxResult add(@Validated @RequestBody SysDictType dict)
-    {
-        if (!dictTypeService.checkDictTypeUnique(dict))
-        {
-            return error("鏂板瀛楀吀'" + dict.getDictName() + "'澶辫触锛屽瓧鍏哥被鍨嬪凡瀛樺湪");
-        }
-        dict.setCreateBy(getUsername());
-        return toAjax(dictTypeService.insertDictType(dict));
-    }
-
-    /**
-     * 淇敼瀛楀吀绫诲瀷
-     */
-    @PreAuthorize("@ss.hasPermi('system:dict:edit')")
-    @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult edit(@Validated @RequestBody SysDictType dict)
-    {
-        if (!dictTypeService.checkDictTypeUnique(dict))
-        {
-            return error("淇敼瀛楀吀'" + dict.getDictName() + "'澶辫触锛屽瓧鍏哥被鍨嬪凡瀛樺湪");
-        }
-        dict.setUpdateBy(getUsername());
-        return toAjax(dictTypeService.updateDictType(dict));
-    }
-
-    /**
-     * 鍒犻櫎瀛楀吀绫诲瀷
-     */
-    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
-    @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{dictIds}")
-    public AjaxResult remove(@PathVariable Long[] dictIds)
-    {
-        dictTypeService.deleteDictTypeByIds(dictIds);
-        return success();
-    }
-
-    /**
-     * 鍒锋柊瀛楀吀缂撳瓨
-     */
-    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
-    @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.CLEAN)
-    @DeleteMapping("/refreshCache")
-    public AjaxResult refreshCache()
-    {
-        dictTypeService.resetDictCache();
-        return success();
-    }
-
-    /**
-     * 鑾峰彇瀛楀吀閫夋嫨妗嗗垪琛�
-     */
-    @GetMapping("/optionselect")
-    public AjaxResult optionselect()
-    {
-        List<SysDictType> dictTypes = dictTypeService.selectDictTypeAll();
-        return success(dictTypes);
-    }
-}
+package com.ruoyi.project.system.controller;
+
+import java.util.List;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.AllArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+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.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.framework.web.page.TableDataInfo;
+import com.ruoyi.project.system.domain.SysDictType;
+import com.ruoyi.project.system.service.ISysDictTypeService;
+
+/**
+ * 鏁版嵁瀛楀吀淇℃伅
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/system/dict/type")
+@AllArgsConstructor
+public class SysDictTypeController extends BaseController
+{
+    private ISysDictTypeService dictTypeService;
+
+    @PreAuthorize("@ss.hasPermi('system:dict:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysDictType dictType)
+    {
+        startPage();
+        List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
+        return getDataTable(list);
+    }
+
+    @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('system:dict:export')")
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, SysDictType dictType)
+    {
+        List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
+        ExcelUtil<SysDictType> util = new ExcelUtil<SysDictType>(SysDictType.class);
+        util.exportExcel(response, list, "瀛楀吀绫诲瀷");
+    }
+
+    /**
+     * 鏌ヨ瀛楀吀绫诲瀷璇︾粏
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:query')")
+    @GetMapping(value = "/{dictId}")
+    public R<?> getInfo(@PathVariable Long dictId)
+    {
+        return R.ok(dictTypeService.selectDictTypeById(dictId));
+    }
+
+    /**
+     * 鏂板瀛楀吀绫诲瀷
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:add')")
+    @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.INSERT)
+    @PostMapping
+    public R<?> add(@Validated @RequestBody SysDictType dict)
+    {
+        if (!dictTypeService.checkDictTypeUnique(dict))
+        {
+            return R.fail("鏂板瀛楀吀'" + dict.getDictName() + "'澶辫触锛屽瓧鍏哥被鍨嬪凡瀛樺湪");
+        }
+        dict.setCreateBy(getUsername());
+        dictTypeService.insertDictType(dict);
+        return R.ok();
+    }
+
+    /**
+     * 淇敼瀛楀吀绫诲瀷
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:edit')")
+    @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public R<?> edit(@Validated @RequestBody SysDictType dict)
+    {
+        if (!dictTypeService.checkDictTypeUnique(dict))
+        {
+            return R.fail("淇敼瀛楀吀'" + dict.getDictName() + "'澶辫触锛屽瓧鍏哥被鍨嬪凡瀛樺湪");
+        }
+        dict.setUpdateBy(getUsername());
+        dictTypeService.updateDictType(dict);
+        return R.ok();
+    }
+
+    /**
+     * 鍒犻櫎瀛楀吀绫诲瀷
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
+    @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{dictIds}")
+    public R<?> remove(@PathVariable Long[] dictIds)
+    {
+        dictTypeService.deleteDictTypeByIds(dictIds);
+        return R.ok();
+    }
+
+    /**
+     * 鍒锋柊瀛楀吀缂撳瓨
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
+    @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.CLEAN)
+    @DeleteMapping("/refreshCache")
+    public R<?> refreshCache()
+    {
+        dictTypeService.resetDictCache();
+        return R.ok();
+    }
+
+    /**
+     * 鑾峰彇瀛楀吀閫夋嫨妗嗗垪琛�
+     */
+    @GetMapping("/optionselect")
+    public R<?> optionselect()
+    {
+        List<SysDictType> dictTypes = dictTypeService.selectDictTypeAll();
+        return R.ok(dictTypes);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/project/system/controller/SysLoginController.java b/src/main/java/com/ruoyi/project/system/controller/SysLoginController.java
index e5c5bfa..55f3caf 100644
--- a/src/main/java/com/ruoyi/project/system/controller/SysLoginController.java
+++ b/src/main/java/com/ruoyi/project/system/controller/SysLoginController.java
@@ -1,155 +1,156 @@
-package com.ruoyi.project.system.controller;
-
-import com.ruoyi.common.constant.Constants;
-import com.ruoyi.common.utils.SecurityUtils;
-import com.ruoyi.framework.security.LoginBody;
-import com.ruoyi.framework.security.LoginUser;
-import com.ruoyi.framework.security.service.SysLoginService;
-import com.ruoyi.framework.security.service.SysPermissionService;
-import com.ruoyi.framework.security.service.TokenService;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.project.system.domain.SysDept;
-import com.ruoyi.project.system.domain.SysMenu;
-import com.ruoyi.project.system.domain.SysUser;
-import com.ruoyi.project.system.domain.vo.SysUserDeptVo;
-import com.ruoyi.project.system.mapper.SysDeptMapper;
-import com.ruoyi.project.system.service.ISysMenuService;
-import com.ruoyi.project.system.service.ISysUserDeptService;
-import com.ruoyi.project.system.service.ISysUserService;
-import lombok.AllArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.util.ObjectUtils;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * 鐧诲綍楠岃瘉
- * 
- * @author ruoyi
- */
-@RestController
-@AllArgsConstructor
-public class SysLoginController
-{
-    private SysLoginService loginService;
-    private ISysMenuService menuService;
-    private SysPermissionService permissionService;
-    private TokenService tokenService;
-    private ISysUserDeptService userDeptService;
-    private ISysUserService userService;
-    private SysDeptMapper sysDeptMapper;
-
-    /**
-     * 鐧诲綍鏂规硶
-     * 
-     * @param loginBody 鐧诲綍淇℃伅
-     * @return 缁撴灉
-     */
-    @PostMapping("/login")
-    public AjaxResult login(@RequestBody LoginBody loginBody)
-    {
-        AjaxResult ajax = AjaxResult.success();
-        // 鐢熸垚浠ょ墝
-        String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
-                loginBody.getUuid());
-        ajax.put(Constants.TOKEN, token);
-        return ajax;
-    }
-
-    /**
-     * 鑾峰彇鐢ㄦ埛淇℃伅
-     * 
-     * @return 鐢ㄦ埛淇℃伅
-     */
-    @GetMapping("/getInfo")
-    public AjaxResult getInfo()
-    {
-        LoginUser loginUser = SecurityUtils.getLoginUser();
-        SysUser user = loginUser.getUser();
-        // 鑾峰彇褰撳墠鐧诲綍鍏徃
-        Long tenantId = loginUser.getTenantId();
-        if(null != tenantId){
-            user.setTenantId(tenantId);
-            SysDept sysDept = sysDeptMapper.selectDeptById(tenantId.longValue());
-            if(!ObjectUtils.isEmpty(sysDept)){
-                user.setCurrentFactoryName(sysDept.getDeptName());
-            }
-        }
-        // 瑙掕壊闆嗗悎
-        Set<String> roles = permissionService.getRolePermission(user);
-        // 鏉冮檺闆嗗悎
-        Set<String> permissions = permissionService.getMenuPermission(user);
-        if (!loginUser.getPermissions().equals(permissions))
-        {
-            loginUser.setPermissions(permissions);
-            tokenService.refreshToken(loginUser);
-        }
-        AjaxResult ajax = AjaxResult.success();
-        ajax.put("user", user);
-        ajax.put("aiEnabled", loginUser.getAiEnabled());
-        ajax.put("roles", roles);
-        ajax.put("permissions", permissions);
-        return ajax;
-    }
-
-    /**
-     * 鑾峰彇璺敱淇℃伅
-     * 
-     * @return 璺敱淇℃伅
-     */
-    @GetMapping("getRouters")
-    public AjaxResult getRouters()
-    {
-        Long userId = SecurityUtils.getUserId();
-        List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);
-        return AjaxResult.success(menuService.buildMenus(menus));
-    }
-
-    @PostMapping("/loginCheck")
-    public AjaxResult loginCheck(@RequestBody LoginBody loginBody)
-    {
-        try {
-            Long userId = loginService.loginCheck(loginBody.getUsername(), loginBody.getPassword());
-            return AjaxResult.success(userId);
-        }catch (Exception e) {
-            return AjaxResult.error(e.getMessage());
-        }
-    }
-
-    @GetMapping("/userLoginFacotryList")
-    public AjaxResult userLoginFacotryList(SysUserDeptVo sysUserDeptVo){
-        List<SysUserDeptVo> sysUserDeptVoList = userDeptService.userLoginFacotryList(sysUserDeptVo);
-        Map<Long, SysUserDeptVo> map = sysUserDeptVoList.stream()
-            .collect(Collectors.toMap(
-                    SysUserDeptVo::getDeptId,
-                    item -> item,
-                    (existing, replacement) -> existing // 濡傛灉閲嶅锛屼繚鐣欑涓�涓�
-            ));
-        List<SysUserDeptVo> uniqueList = new ArrayList<>(map.values());
-        return AjaxResult.success(uniqueList);
-    }
-
-    /**
-     * 閫夋嫨鍏徃鐧诲綍
-     *
-     * @param loginBody 鐧诲綍淇℃伅
-     * @return 缁撴灉
-     */
-    @PostMapping("/loginCheckFactory")
-    public AjaxResult loginCheckFactory(@RequestBody LoginBody loginBody)
-    {
-        AjaxResult ajax = AjaxResult.success();
-        // 鐢熸垚浠ょ墝
-        String token = loginService.loginCheckFactory(loginBody.getUsername(), loginBody.getPassword(),loginBody.getFactoryId());
-        ajax.put(Constants.TOKEN, token);
-        return ajax;
-    }
-}
+package com.ruoyi.project.system.controller;
+
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.security.LoginBody;
+import com.ruoyi.framework.security.LoginUser;
+import com.ruoyi.framework.security.service.SysLoginService;
+import com.ruoyi.framework.security.service.SysPermissionService;
+import com.ruoyi.framework.security.service.TokenService;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.project.system.domain.SysDept;
+import com.ruoyi.project.system.domain.SysMenu;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.domain.vo.SysUserDeptVo;
+import com.ruoyi.project.system.mapper.SysDeptMapper;
+import com.ruoyi.project.system.service.ISysMenuService;
+import com.ruoyi.project.system.service.ISysUserDeptService;
+import com.ruoyi.project.system.service.ISysUserService;
+import lombok.AllArgsConstructor;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * 鐧诲綍楠岃瘉
+ *
+ * @author ruoyi
+ */
+@RestController
+@AllArgsConstructor
+public class SysLoginController extends BaseController
+{
+    private SysLoginService loginService;
+    private ISysMenuService menuService;
+    private SysPermissionService permissionService;
+    private TokenService tokenService;
+    private ISysUserDeptService userDeptService;
+    private ISysUserService userService;
+    private SysDeptMapper sysDeptMapper;
+
+    /**
+     * 鐧诲綍鏂规硶
+     *
+     * @param loginBody 鐧诲綍淇℃伅
+     * @return 缁撴灉
+     */
+    @PostMapping("/login")
+    public R<?> login(@RequestBody LoginBody loginBody)
+    {
+        // 鐢熸垚浠ょ墝
+        String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
+                loginBody.getUuid());
+        Map<String, Object> map = new HashMap<>();
+        map.put(Constants.TOKEN, token);
+        return R.ok(map);
+    }
+
+    /**
+     * 鑾峰彇鐢ㄦ埛淇℃伅
+     *
+     * @return 鐢ㄦ埛淇℃伅
+     */
+    @GetMapping("/getInfo")
+    public R<?> getInfo()
+    {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        SysUser user = loginUser.getUser();
+        // 鑾峰彇褰撳墠鐧诲綍鍏徃
+        Long tenantId = loginUser.getTenantId();
+        if(null != tenantId){
+            user.setTenantId(tenantId);
+            SysDept sysDept = sysDeptMapper.selectDeptById(tenantId.longValue());
+            if(!ObjectUtils.isEmpty(sysDept)){
+                user.setCurrentFactoryName(sysDept.getDeptName());
+            }
+        }
+        // 瑙掕壊闆嗗悎
+        Set<String> roles = permissionService.getRolePermission(user);
+        // 鏉冮檺闆嗗悎
+        Set<String> permissions = permissionService.getMenuPermission(user);
+        if (!loginUser.getPermissions().equals(permissions))
+        {
+            loginUser.setPermissions(permissions);
+            tokenService.refreshToken(loginUser);
+        }
+        Map<String, Object> map = new HashMap<>();
+        map.put("user", user);
+        map.put("aiEnabled", loginUser.getAiEnabled());
+        map.put("roles", roles);
+        map.put("permissions", permissions);
+        return R.ok(map);
+    }
+
+    /**
+     * 鑾峰彇璺敱淇℃伅
+     *
+     * @return 璺敱淇℃伅
+     */
+    @GetMapping("getRouters")
+    public R<?> getRouters()
+    {
+        Long userId = SecurityUtils.getUserId();
+        List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);
+        return R.ok(menuService.buildMenus(menus));
+    }
+
+    @PostMapping("/loginCheck")
+    public R<?> loginCheck(@RequestBody LoginBody loginBody)
+    {
+        try {
+            Long userId = loginService.loginCheck(loginBody.getUsername(), loginBody.getPassword());
+            return R.ok(userId);
+        }catch (Exception e) {
+            return R.fail(e.getMessage());
+        }
+    }
+
+    @GetMapping("/userLoginFacotryList")
+    public R<?> userLoginFacotryList(SysUserDeptVo sysUserDeptVo){
+        List<SysUserDeptVo> sysUserDeptVoList = userDeptService.userLoginFacotryList(sysUserDeptVo);
+        Map<Long, SysUserDeptVo> map = sysUserDeptVoList.stream()
+            .collect(Collectors.toMap(
+                    SysUserDeptVo::getDeptId,
+                    item -> item,
+                    (existing, replacement) -> existing // 濡傛灉閲嶅锛屼繚鐣欑涓�涓�
+            ));
+        List<SysUserDeptVo> uniqueList = new ArrayList<>(map.values());
+        return R.ok(uniqueList);
+    }
+
+    /**
+     * 閫夋嫨鍏徃鐧诲綍
+     *
+     * @param loginBody 鐧诲綍淇℃伅
+     * @return 缁撴灉
+     */
+    @PostMapping("/loginCheckFactory")
+    public R<?> loginCheckFactory(@RequestBody LoginBody loginBody)
+    {
+        // 鐢熸垚浠ょ墝
+        String token = loginService.loginCheckFactory(loginBody.getUsername(), loginBody.getPassword(),loginBody.getFactoryId());
+        Map<String, Object> map = new HashMap<>();
+        map.put(Constants.TOKEN, token);
+        return R.ok(map);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/project/system/controller/SysMenuController.java b/src/main/java/com/ruoyi/project/system/controller/SysMenuController.java
index 865e8a4..285dc69 100644
--- a/src/main/java/com/ruoyi/project/system/controller/SysMenuController.java
+++ b/src/main/java/com/ruoyi/project/system/controller/SysMenuController.java
@@ -1,136 +1,142 @@
-package com.ruoyi.project.system.controller;
-
-import com.ruoyi.common.constant.UserConstants;
-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.AjaxResult;
-import com.ruoyi.project.system.domain.SysMenu;
-import com.ruoyi.project.system.service.ISysMenuService;
-import lombok.AllArgsConstructor;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-/**
- * 鑿滃崟淇℃伅
- * 
- * @author ruoyi
- */
-@RestController
-@RequestMapping("/system/menu")
-@AllArgsConstructor
-public class SysMenuController extends BaseController
-{
-    private ISysMenuService menuService;
-
-    /**
-     * 鑾峰彇鑿滃崟鍒楄〃
-     */
-    @PreAuthorize("@ss.hasPermi('system:menu:list')")
-    @GetMapping("/list")
-    public AjaxResult list(SysMenu menu)
-    {
-        List<SysMenu> menus = menuService.selectMenuList(menu, getUserId());
-        return success(menus);
-    }
-
-    /**
-     * 鏍规嵁鑿滃崟缂栧彿鑾峰彇璇︾粏淇℃伅
-     */
-    @PreAuthorize("@ss.hasPermi('system:menu:query')")
-    @GetMapping(value = "/{menuId}")
-    public AjaxResult getInfo(@PathVariable Long menuId)
-    {
-        return success(menuService.selectMenuById(menuId));
-    }
-
-    /**
-     * 鑾峰彇鑿滃崟涓嬫媺鏍戝垪琛�
-     */
-    @GetMapping("/treeselect")
-    public AjaxResult treeselect(SysMenu menu)
-    {
-        List<SysMenu> menus = menuService.selectMenuList(menu, getUserId());
-        return success(menuService.buildMenuTreeSelect(menus));
-    }
-
-    /**
-     * 鍔犺浇瀵瑰簲瑙掕壊鑿滃崟鍒楄〃鏍�
-     */
-    @GetMapping(value = "/roleMenuTreeselect/{roleId}")
-    public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId)
-    {
-        List<SysMenu> menus = menuService.selectMenuList(getUserId());
-        AjaxResult ajax = AjaxResult.success();
-        ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId));
-        ajax.put("menus", menuService.buildMenuTreeSelect(menus));
-        return ajax;
-    }
-
-    /**
-     * 鏂板鑿滃崟
-     */
-    @PreAuthorize("@ss.hasPermi('system:menu:add')")
-    @Log(title = "鑿滃崟绠$悊", businessType = BusinessType.INSERT)
-    @PostMapping
-    public AjaxResult add(@Validated @RequestBody SysMenu menu)
-    {
-        if (!menuService.checkMenuNameUnique(menu))
-        {
-            return error("鏂板鑿滃崟'" + menu.getMenuName() + "'澶辫触锛岃彍鍗曞悕绉板凡瀛樺湪");
-        }
-        else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath()))
-        {
-            return error("鏂板鑿滃崟'" + menu.getMenuName() + "'澶辫触锛屽湴鍧�蹇呴』浠ttp(s)://寮�澶�");
-        }
-        menu.setCreateBy(getUsername());
-        return toAjax(menuService.insertMenu(menu));
-    }
-
-    /**
-     * 淇敼鑿滃崟
-     */
-    @PreAuthorize("@ss.hasPermi('system:menu:edit')")
-    @Log(title = "鑿滃崟绠$悊", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult edit(@Validated @RequestBody SysMenu menu)
-    {
-        if (!menuService.checkMenuNameUnique(menu))
-        {
-            return error("淇敼鑿滃崟'" + menu.getMenuName() + "'澶辫触锛岃彍鍗曞悕绉板凡瀛樺湪");
-        }
-        else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath()))
-        {
-            return error("淇敼鑿滃崟'" + menu.getMenuName() + "'澶辫触锛屽湴鍧�蹇呴』浠ttp(s)://寮�澶�");
-        }
-        else if (menu.getMenuId().equals(menu.getParentId()))
-        {
-            return error("淇敼鑿滃崟'" + menu.getMenuName() + "'澶辫触锛屼笂绾ц彍鍗曚笉鑳介�夋嫨鑷繁");
-        }
-        menu.setUpdateBy(getUsername());
-        return toAjax(menuService.updateMenu(menu));
-    }
-
-    /**
-     * 鍒犻櫎鑿滃崟
-     */
-    @PreAuthorize("@ss.hasPermi('system:menu:remove')")
-    @Log(title = "鑿滃崟绠$悊", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{menuId}")
-    public AjaxResult remove(@PathVariable("menuId") Long menuId)
-    {
-        if (menuService.hasChildByMenuId(menuId))
-        {
-            return warn("瀛樺湪瀛愯彍鍗�,涓嶅厑璁稿垹闄�");
-        }
-        if (menuService.checkMenuExistRole(menuId))
-        {
-            return warn("鑿滃崟宸插垎閰�,涓嶅厑璁稿垹闄�");
-        }
-        return toAjax(menuService.deleteMenuById(menuId));
-    }
+package com.ruoyi.project.system.controller;
+
+import com.ruoyi.common.constant.HttpStatus;
+import com.ruoyi.common.constant.UserConstants;
+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 com.ruoyi.project.system.domain.SysMenu;
+import com.ruoyi.project.system.service.ISysMenuService;
+import lombok.AllArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鑿滃崟淇℃伅
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/system/menu")
+@AllArgsConstructor
+public class SysMenuController extends BaseController
+{
+    private ISysMenuService menuService;
+
+    /**
+     * 鑾峰彇鑿滃崟鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('system:menu:list')")
+    @GetMapping("/list")
+    public R<?> list(SysMenu menu)
+    {
+        List<SysMenu> menus = menuService.selectMenuList(menu, getUserId());
+        return R.ok(menus);
+    }
+
+    /**
+     * 鏍规嵁鑿滃崟缂栧彿鑾峰彇璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('system:menu:query')")
+    @GetMapping(value = "/{menuId}")
+    public R<?> getInfo(@PathVariable Long menuId)
+    {
+        return R.ok(menuService.selectMenuById(menuId));
+    }
+
+    /**
+     * 鑾峰彇鑿滃崟涓嬫媺鏍戝垪琛�
+     */
+    @GetMapping("/treeselect")
+    public R<?> treeselect(SysMenu menu)
+    {
+        List<SysMenu> menus = menuService.selectMenuList(menu, getUserId());
+        return R.ok(menuService.buildMenuTreeSelect(menus));
+    }
+
+    /**
+     * 鍔犺浇瀵瑰簲瑙掕壊鑿滃崟鍒楄〃鏍�
+     */
+    @GetMapping(value = "/roleMenuTreeselect/{roleId}")
+    public R<?> roleMenuTreeselect(@PathVariable("roleId") Long roleId)
+    {
+        List<SysMenu> menus = menuService.selectMenuList(getUserId());
+        Map<String, Object> map = new HashMap<>();
+        map.put("checkedKeys", menuService.selectMenuListByRoleId(roleId));
+        map.put("menus", menuService.buildMenuTreeSelect(menus));
+        return R.ok(map);
+    }
+
+    /**
+     * 鏂板鑿滃崟
+     */
+    @PreAuthorize("@ss.hasPermi('system:menu:add')")
+    @Log(title = "鑿滃崟绠$悊", businessType = BusinessType.INSERT)
+    @PostMapping
+    public R<?> add(@Validated @RequestBody SysMenu menu)
+    {
+        if (!menuService.checkMenuNameUnique(menu))
+        {
+            return R.fail("鏂板鑿滃崟'" + menu.getMenuName() + "'澶辫触锛岃彍鍗曞悕绉板凡瀛樺湪");
+        }
+        else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath()))
+        {
+            return R.fail("鏂板鑿滃崟'" + menu.getMenuName() + "'澶辫触锛屽湴鍧�蹇呴』浠ttp(s)://寮�澶�");
+        }
+        menu.setCreateBy(getUsername());
+        menuService.insertMenu(menu);
+        return R.ok();
+    }
+
+    /**
+     * 淇敼鑿滃崟
+     */
+    @PreAuthorize("@ss.hasPermi('system:menu:edit')")
+    @Log(title = "鑿滃崟绠$悊", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public R<?> edit(@Validated @RequestBody SysMenu menu)
+    {
+        if (!menuService.checkMenuNameUnique(menu))
+        {
+            return R.fail("淇敼鑿滃崟'" + menu.getMenuName() + "'澶辫触锛岃彍鍗曞悕绉板凡瀛樺湪");
+        }
+        else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath()))
+        {
+            return R.fail("淇敼鑿滃崟'" + menu.getMenuName() + "'澶辫触锛屽湴鍧�蹇呴』浠ttp(s)://寮�澶�");
+        }
+        else if (menu.getMenuId().equals(menu.getParentId()))
+        {
+            return R.fail("淇敼鑿滃崟'" + menu.getMenuName() + "'澶辫触锛屼笂绾ц彍鍗曚笉鑳介�夋嫨鑷繁");
+        }
+        menu.setUpdateBy(getUsername());
+        menuService.updateMenu(menu);
+        return R.ok();
+    }
+
+    /**
+     * 鍒犻櫎鑿滃崟
+     */
+    @PreAuthorize("@ss.hasPermi('system:menu:remove')")
+    @Log(title = "鑿滃崟绠$悊", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{menuId}")
+    public R<?> remove(@PathVariable("menuId") Long menuId)
+    {
+        if (menuService.hasChildByMenuId(menuId))
+        {
+            return R.fail(HttpStatus.WARN, "瀛樺湪瀛愯彍鍗�,涓嶅厑璁稿垹闄�");
+        }
+        if (menuService.checkMenuExistRole(menuId))
+        {
+            return R.fail(HttpStatus.WARN, "鑿滃崟宸插垎閰�,涓嶅厑璁稿垹闄�");
+        }
+        menuService.deleteMenuById(menuId);
+        return R.ok();
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/project/system/controller/SysNoticeController.java b/src/main/java/com/ruoyi/project/system/controller/SysNoticeController.java
index 5aa3413..40458bf 100644
--- a/src/main/java/com/ruoyi/project/system/controller/SysNoticeController.java
+++ b/src/main/java/com/ruoyi/project/system/controller/SysNoticeController.java
@@ -1,96 +1,99 @@
-package com.ruoyi.project.system.controller;
-
-import java.util.List;
-
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.framework.web.domain.R;
-import io.swagger.v3.oas.annotations.Operation;
-import lombok.AllArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-import com.ruoyi.framework.aspectj.lang.annotation.Log;
-import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
-import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.framework.web.page.TableDataInfo;
-import com.ruoyi.project.system.domain.SysNotice;
-import com.ruoyi.project.system.service.ISysNoticeService;
-
-/**
- * 鍏憡 淇℃伅鎿嶄綔澶勭悊
- *
- * @author ruoyi
- */
-@RestController
-@RequestMapping("/system/notice")
-@AllArgsConstructor
-public class SysNoticeController extends BaseController {
-    private ISysNoticeService noticeService;
-
-    /**
-     * 鑾峰彇閫氱煡鍏憡鍒楄〃
-     */
-    @GetMapping("/list")
-    public R<IPage<SysNotice>> list(SysNotice notice, Page page) {
-        IPage<SysNotice> list = noticeService.selectNoticeList(notice, page);
-        return R.ok(list);
-    }
-
-    /**
-     * 鑾峰彇鏈鏁伴噺
-     */
-    @GetMapping("/getCount")
-    public R getCount(Long consigneeId) {
-        return R.ok(noticeService.getCount(consigneeId));
-    }
-
-    /**
-     * 鏍规嵁閫氱煡鍏憡缂栧彿鑾峰彇璇︾粏淇℃伅
-     */
-    @GetMapping(value = "/{noticeId}")
-    public AjaxResult getInfo(@PathVariable Long noticeId) {
-        return success(noticeService.selectNoticeById(noticeId));
-    }
-
-    /**
-     * 鏂板閫氱煡鍏憡
-     */
-    @PostMapping
-    public AjaxResult add(@Validated @RequestBody SysNotice notice) {
-        return toAjax(noticeService.insertNotice(notice));
-    }
-
-    /**
-     * 淇敼閫氱煡鍏憡
-     */
-    @PutMapping
-    public AjaxResult edit(@Validated @RequestBody SysNotice notice) {
-        return toAjax(noticeService.updateNotice(notice));
-    }
-
-    /**
-     * 鍒犻櫎閫氱煡鍏憡
-     */
-    @DeleteMapping("/{noticeIds}")
-    public AjaxResult remove(@PathVariable Long[] noticeIds) {
-        return toAjax(noticeService.deleteNoticeByIds(noticeIds));
-    }
-
-    /**
-     * 涓�閿凡璇�
-     */
-    @PostMapping("/readAll")
-    public AjaxResult readAll() {
-        return toAjax(noticeService.readAll());
-    }
-
-    @PostMapping("appReadNotice")
-    @Operation(summary = "绉诲姩绔牴鎹秷鎭疘D杩涜宸茶")
-    public AjaxResult appReadNotice(@RequestParam("noticeId") Long noticeId) {
-        boolean result = noticeService.appReadNotice(noticeId);
-        return toAjax(result);
-    }
-}
+package com.ruoyi.project.system.controller;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.web.domain.R;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+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.page.TableDataInfo;
+import com.ruoyi.project.system.domain.SysNotice;
+import com.ruoyi.project.system.service.ISysNoticeService;
+
+/**
+ * 鍏憡 淇℃伅鎿嶄綔澶勭悊
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/system/notice")
+@AllArgsConstructor
+public class SysNoticeController extends BaseController {
+    private ISysNoticeService noticeService;
+
+    /**
+     * 鑾峰彇閫氱煡鍏憡鍒楄〃
+     */
+    @GetMapping("/list")
+    public R<IPage<SysNotice>> list(SysNotice notice, Page page) {
+        IPage<SysNotice> list = noticeService.selectNoticeList(notice, page);
+        return R.ok(list);
+    }
+
+    /**
+     * 鑾峰彇鏈鏁伴噺
+     */
+    @GetMapping("/getCount")
+    public R getCount(Long consigneeId) {
+        return R.ok(noticeService.getCount(consigneeId));
+    }
+
+    /**
+     * 鏍规嵁閫氱煡鍏憡缂栧彿鑾峰彇璇︾粏淇℃伅
+     */
+    @GetMapping(value = "/{noticeId}")
+    public R<?> getInfo(@PathVariable Long noticeId) {
+        return R.ok(noticeService.selectNoticeById(noticeId));
+    }
+
+    /**
+     * 鏂板閫氱煡鍏憡
+     */
+    @PostMapping
+    public R<?> add(@Validated @RequestBody SysNotice notice) {
+        noticeService.insertNotice(notice);
+        return R.ok();
+    }
+
+    /**
+     * 淇敼閫氱煡鍏憡
+     */
+    @PutMapping
+    public R<?> edit(@Validated @RequestBody SysNotice notice) {
+        noticeService.updateNotice(notice);
+        return R.ok();
+    }
+
+    /**
+     * 鍒犻櫎閫氱煡鍏憡
+     */
+    @DeleteMapping("/{noticeIds}")
+    public R<?> remove(@PathVariable Long[] noticeIds) {
+        noticeService.deleteNoticeByIds(noticeIds);
+        return R.ok();
+    }
+
+    /**
+     * 涓�閿凡璇�
+     */
+    @PostMapping("/readAll")
+    public R<?> readAll() {
+        noticeService.readAll();
+        return R.ok();
+    }
+
+    @PostMapping("appReadNotice")
+    @Operation(summary = "绉诲姩绔牴鎹秷鎭疘D杩涜宸茶")
+    public R<?> appReadNotice(@RequestParam("noticeId") Long noticeId) {
+        noticeService.appReadNotice(noticeId);
+        return R.ok();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/project/system/controller/SysPostController.java b/src/main/java/com/ruoyi/project/system/controller/SysPostController.java
index a4776c4..652ab30 100644
--- a/src/main/java/com/ruoyi/project/system/controller/SysPostController.java
+++ b/src/main/java/com/ruoyi/project/system/controller/SysPostController.java
@@ -1,133 +1,135 @@
-package com.ruoyi.project.system.controller;
-
-import java.util.List;
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.AllArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-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.poi.ExcelUtil;
-import com.ruoyi.framework.aspectj.lang.annotation.Log;
-import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
-import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.framework.web.page.TableDataInfo;
-import com.ruoyi.project.system.domain.SysPost;
-import com.ruoyi.project.system.service.ISysPostService;
-
-/**
- * 宀椾綅淇℃伅鎿嶄綔澶勭悊
- * 
- * @author ruoyi
- */
-@RestController
-@RequestMapping("/system/post")
-@AllArgsConstructor
-public class SysPostController extends BaseController
-{
-    private ISysPostService postService;
-
-    /**
-     * 鑾峰彇宀椾綅鍒楄〃
-     */
-    @PreAuthorize("@ss.hasPermi('system:post:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(SysPost post)
-    {
-        startPage();
-        List<SysPost> list = postService.selectPostList(post);
-        return getDataTable(list);
-    }
-    /**
-     * 瀵煎嚭宀椾綅鍒楄〃
-     */
-    
-    @Log(title = "宀椾綅绠$悊", businessType = BusinessType.EXPORT)
-    @PreAuthorize("@ss.hasPermi('system:post:export')")
-    @PostMapping("/export")
-    public void export(HttpServletResponse response, SysPost post)
-    {
-        List<SysPost> list = postService.selectPostList(post);
-        ExcelUtil<SysPost> util = new ExcelUtil<SysPost>(SysPost.class);
-        util.exportExcel(response, list, "宀椾綅鏁版嵁");
-    }
-
-    /**
-     * 鏍规嵁宀椾綅缂栧彿鑾峰彇璇︾粏淇℃伅
-     */
-    @PreAuthorize("@ss.hasPermi('system:post:query')")
-    @GetMapping(value = "/{postId}")
-    public AjaxResult getInfo(@PathVariable Long postId)
-    {
-        return success(postService.selectPostById(postId));
-    }
-
-    /**
-     * 鏂板宀椾綅
-     */
-    @PreAuthorize("@ss.hasPermi('system:post:add')")
-    @Log(title = "宀椾綅绠$悊", businessType = BusinessType.INSERT)
-    @PostMapping
-    public AjaxResult add(@Validated @RequestBody SysPost post)
-    {
-        if (!postService.checkPostNameUnique(post))
-        {
-            return error("鏂板宀椾綅'" + post.getPostName() + "'澶辫触锛屽矖浣嶅悕绉板凡瀛樺湪");
-        }
-        else if (!postService.checkPostCodeUnique(post))
-        {
-            return error("鏂板宀椾綅'" + post.getPostName() + "'澶辫触锛屽矖浣嶇紪鐮佸凡瀛樺湪");
-        }
-        post.setCreateBy(getUsername());
-        return toAjax(postService.insertPost(post));
-    }
-
-    /**
-     * 淇敼宀椾綅
-     */
-    @PreAuthorize("@ss.hasPermi('system:post:edit')")
-    @Log(title = "宀椾綅绠$悊", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult edit(@Validated @RequestBody SysPost post)
-    {
-        if (!postService.checkPostNameUnique(post))
-        {
-            return error("淇敼宀椾綅'" + post.getPostName() + "'澶辫触锛屽矖浣嶅悕绉板凡瀛樺湪");
-        }
-        else if (!postService.checkPostCodeUnique(post))
-        {
-            return error("淇敼宀椾綅'" + post.getPostName() + "'澶辫触锛屽矖浣嶇紪鐮佸凡瀛樺湪");
-        }
-        post.setUpdateBy(getUsername());
-        return toAjax(postService.updatePost(post));
-    }
-
-    /**
-     * 鍒犻櫎宀椾綅
-     */
-    @PreAuthorize("@ss.hasPermi('system:post:remove')")
-    @Log(title = "宀椾綅绠$悊", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{postIds}")
-    public AjaxResult remove(@PathVariable Long[] postIds)
-    {
-        return toAjax(postService.deletePostByIds(postIds));
-    }
-
-    /**
-     * 鑾峰彇宀椾綅閫夋嫨妗嗗垪琛�
-     */
-    @GetMapping("/optionselect")
-    public AjaxResult optionselect()
-    {
-        List<SysPost> posts = postService.selectPostAll();
-        return success(posts);
-    }
-}
+package com.ruoyi.project.system.controller;
+
+import java.util.List;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.AllArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+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.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.framework.web.page.TableDataInfo;
+import com.ruoyi.project.system.domain.SysPost;
+import com.ruoyi.project.system.service.ISysPostService;
+
+/**
+ * 宀椾綅淇℃伅鎿嶄綔澶勭悊
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/system/post")
+@AllArgsConstructor
+public class SysPostController extends BaseController
+{
+    private ISysPostService postService;
+
+    /**
+     * 鑾峰彇宀椾綅鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('system:post:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysPost post)
+    {
+        startPage();
+        List<SysPost> list = postService.selectPostList(post);
+        return getDataTable(list);
+    }
+    /**
+     * 瀵煎嚭宀椾綅鍒楄〃
+     */
+
+    @Log(title = "宀椾綅绠$悊", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('system:post:export')")
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, SysPost post)
+    {
+        List<SysPost> list = postService.selectPostList(post);
+        ExcelUtil<SysPost> util = new ExcelUtil<SysPost>(SysPost.class);
+        util.exportExcel(response, list, "宀椾綅鏁版嵁");
+    }
+
+    /**
+     * 鏍规嵁宀椾綅缂栧彿鑾峰彇璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('system:post:query')")
+    @GetMapping(value = "/{postId}")
+    public R<?> getInfo(@PathVariable Long postId)
+    {
+        return R.ok(postService.selectPostById(postId));
+    }
+
+    /**
+     * 鏂板宀椾綅
+     */
+    @PreAuthorize("@ss.hasPermi('system:post:add')")
+    @Log(title = "宀椾綅绠$悊", businessType = BusinessType.INSERT)
+    @PostMapping
+    public R<?> add(@Validated @RequestBody SysPost post)
+    {
+        if (!postService.checkPostNameUnique(post))
+        {
+            return R.fail("鏂板宀椾綅'" + post.getPostName() + "'澶辫触锛屽矖浣嶅悕绉板凡瀛樺湪");
+        }
+        else if (!postService.checkPostCodeUnique(post))
+        {
+            return R.fail("鏂板宀椾綅'" + post.getPostName() + "'澶辫触锛屽矖浣嶇紪鐮佸凡瀛樺湪");
+        }
+        post.setCreateBy(getUsername());
+        postService.insertPost(post);
+        return R.ok();
+    }
+
+    /**
+     * 淇敼宀椾綅
+     */
+    @PreAuthorize("@ss.hasPermi('system:post:edit')")
+    @Log(title = "宀椾綅绠$悊", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public R<?> edit(@Validated @RequestBody SysPost post)
+    {
+        if (!postService.checkPostNameUnique(post))
+        {
+            return R.fail("淇敼宀椾綅'" + post.getPostName() + "'澶辫触锛屽矖浣嶅悕绉板凡瀛樺湪");
+        }
+        else if (!postService.checkPostCodeUnique(post))
+        {
+            return R.fail("淇敼宀椾綅'" + post.getPostName() + "'澶辫触锛屽矖浣嶇紪鐮佸凡瀛樺湪");
+        }
+        post.setUpdateBy(getUsername());
+        postService.updatePost(post);
+        return R.ok();
+    }
+
+    /**
+     * 鍒犻櫎宀椾綅
+     */
+    @PreAuthorize("@ss.hasPermi('system:post:remove')")
+    @Log(title = "宀椾綅绠$悊", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{postIds}")
+    public R<?> remove(@PathVariable Long[] postIds)
+    {
+        postService.deletePostByIds(postIds);
+        return R.ok();
+    }
+
+    /**
+     * 鑾峰彇宀椾綅閫夋嫨妗嗗垪琛�
+     */
+    @GetMapping("/optionselect")
+    public R<?> optionselect()
+    {
+        List<SysPost> posts = postService.selectPostAll();
+        return R.ok(posts);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/project/system/controller/SysProfileController.java b/src/main/java/com/ruoyi/project/system/controller/SysProfileController.java
index 62f6db5..dcc6fe2 100644
--- a/src/main/java/com/ruoyi/project/system/controller/SysProfileController.java
+++ b/src/main/java/com/ruoyi/project/system/controller/SysProfileController.java
@@ -1,133 +1,135 @@
-package com.ruoyi.project.system.controller;
-
-import com.ruoyi.common.utils.SecurityUtils;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.common.utils.file.FileUploadUtils;
-import com.ruoyi.common.utils.file.MimeTypeUtils;
-import com.ruoyi.framework.aspectj.lang.annotation.Log;
-import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
-import com.ruoyi.framework.config.RuoYiConfig;
-import com.ruoyi.framework.security.LoginUser;
-import com.ruoyi.framework.security.service.TokenService;
-import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.project.system.domain.SysUser;
-import com.ruoyi.project.system.service.ISysUserService;
-import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.util.Map;
-
-/**
- * 涓汉淇℃伅 涓氬姟澶勭悊
- * 
- * @author ruoyi
- */
-@RestController
-@RequestMapping("/system/user/profile")
-@AllArgsConstructor
-public class SysProfileController extends BaseController
-{
-    private ISysUserService userService;
-    private TokenService tokenService;
-
-    /**
-     * 涓汉淇℃伅
-     */
-    @GetMapping
-    public AjaxResult profile()
-    {
-        LoginUser loginUser = getLoginUser();
-        SysUser user = loginUser.getUser();
-        AjaxResult ajax = AjaxResult.success(user);
-        ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername()));
-        ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername()));
-        return ajax;
-    }
-
-    /**
-     * 淇敼鐢ㄦ埛
-     */
-    @Log(title = "涓汉淇℃伅", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult updateProfile(@RequestBody SysUser user)
-    {
-        LoginUser loginUser = getLoginUser();
-        SysUser currentUser = loginUser.getUser();
-        currentUser.setNickName(user.getNickName());
-        currentUser.setEmail(user.getEmail());
-        currentUser.setPhonenumber(user.getPhonenumber());
-        currentUser.setSex(user.getSex());
-        if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(currentUser))
-        {
-            return error("淇敼鐢ㄦ埛'" + loginUser.getUsername() + "'澶辫触锛屾墜鏈哄彿鐮佸凡瀛樺湪");
-        }
-        if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(currentUser))
-        {
-            return error("淇敼鐢ㄦ埛'" + loginUser.getUsername() + "'澶辫触锛岄偖绠辫处鍙峰凡瀛樺湪");
-        }
-        if (userService.updateUserProfile(currentUser) > 0)
-        {
-            // 鏇存柊缂撳瓨鐢ㄦ埛淇℃伅
-            tokenService.setLoginUser(loginUser);
-            return success();
-        }
-        return error("淇敼涓汉淇℃伅寮傚父锛岃鑱旂郴绠$悊鍛�");
-    }
-
-    /**
-     * 閲嶇疆瀵嗙爜
-     */
-    @Log(title = "涓汉淇℃伅", businessType = BusinessType.UPDATE)
-    @PutMapping("/updatePwd")
-    public AjaxResult updatePwd(@RequestBody Map<String, String> params)
-    {
-        String oldPassword = params.get("oldPassword");
-        String newPassword = params.get("newPassword");
-        LoginUser loginUser = getLoginUser();
-        String userName = loginUser.getUsername();
-        String password = loginUser.getPassword();
-        if (!SecurityUtils.matchesPassword(oldPassword, password))
-        {
-            return error("淇敼瀵嗙爜澶辫触锛屾棫瀵嗙爜閿欒");
-        }
-        if (SecurityUtils.matchesPassword(newPassword, password))
-        {
-            return error("鏂板瘑鐮佷笉鑳戒笌鏃у瘑鐮佺浉鍚�");
-        }
-        newPassword = SecurityUtils.encryptPassword(newPassword);
-        if (userService.resetUserPwd(userName, newPassword) > 0)
-        {
-            // 鏇存柊缂撳瓨鐢ㄦ埛瀵嗙爜
-            loginUser.getUser().setPassword(newPassword);
-            tokenService.setLoginUser(loginUser);
-            return success();
-        }
-        return error("淇敼瀵嗙爜寮傚父锛岃鑱旂郴绠$悊鍛�");
-    }
-
-    /**
-     * 澶村儚涓婁紶
-     */
-    @Log(title = "鐢ㄦ埛澶村儚", businessType = BusinessType.UPDATE)
-    @PostMapping("/avatar")
-    public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws Exception
-    {
-        if (!file.isEmpty())
-        {
-            LoginUser loginUser = getLoginUser();
-            String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION);
-            if (userService.updateUserAvatar(loginUser.getUsername(), avatar))
-            {
-                AjaxResult ajax = AjaxResult.success();
-                ajax.put("imgUrl", avatar);
-                // 鏇存柊缂撳瓨鐢ㄦ埛澶村儚
-                loginUser.getUser().setAvatar(avatar);
-                tokenService.setLoginUser(loginUser);
-                return ajax;
-            }
-        }
-        return error("涓婁紶鍥剧墖寮傚父锛岃鑱旂郴绠$悊鍛�");
-    }
-}
+package com.ruoyi.project.system.controller;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.file.FileUploadUtils;
+import com.ruoyi.common.utils.file.MimeTypeUtils;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
+import com.ruoyi.framework.config.RuoYiConfig;
+import com.ruoyi.framework.security.LoginUser;
+import com.ruoyi.framework.security.service.TokenService;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.service.ISysUserService;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 涓汉淇℃伅 涓氬姟澶勭悊
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/system/user/profile")
+@AllArgsConstructor
+public class SysProfileController extends BaseController
+{
+    private ISysUserService userService;
+    private TokenService tokenService;
+
+    /**
+     * 涓汉淇℃伅
+     */
+    @GetMapping
+    public R<?> profile()
+    {
+        LoginUser loginUser = getLoginUser();
+        SysUser user = loginUser.getUser();
+        Map<String, Object> map = new HashMap<>();
+        map.put("data", user);
+        map.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername()));
+        map.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername()));
+        return R.ok(map);
+    }
+
+    /**
+     * 淇敼鐢ㄦ埛
+     */
+    @Log(title = "涓汉淇℃伅", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public R<?> updateProfile(@RequestBody SysUser user)
+    {
+        LoginUser loginUser = getLoginUser();
+        SysUser currentUser = loginUser.getUser();
+        currentUser.setNickName(user.getNickName());
+        currentUser.setEmail(user.getEmail());
+        currentUser.setPhonenumber(user.getPhonenumber());
+        currentUser.setSex(user.getSex());
+        if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(currentUser))
+        {
+            return R.fail("淇敼鐢ㄦ埛'" + loginUser.getUsername() + "'澶辫触锛屾墜鏈哄彿鐮佸凡瀛樺湪");
+        }
+        if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(currentUser))
+        {
+            return R.fail("淇敼鐢ㄦ埛'" + loginUser.getUsername() + "'澶辫触锛岄偖绠辫处鍙峰凡瀛樺湪");
+        }
+        if (userService.updateUserProfile(currentUser) > 0)
+        {
+            // 鏇存柊缂撳瓨鐢ㄦ埛淇℃伅
+            tokenService.setLoginUser(loginUser);
+            return R.ok();
+        }
+        return R.fail("淇敼涓汉淇℃伅寮傚父锛岃鑱旂郴绠$悊鍛�");
+    }
+
+    /**
+     * 閲嶇疆瀵嗙爜
+     */
+    @Log(title = "涓汉淇℃伅", businessType = BusinessType.UPDATE)
+    @PutMapping("/updatePwd")
+    public R<?> updatePwd(@RequestBody Map<String, String> params)
+    {
+        String oldPassword = params.get("oldPassword");
+        String newPassword = params.get("newPassword");
+        LoginUser loginUser = getLoginUser();
+        String userName = loginUser.getUsername();
+        String password = loginUser.getPassword();
+        if (!SecurityUtils.matchesPassword(oldPassword, password))
+        {
+            return R.fail("淇敼瀵嗙爜澶辫触锛屾棫瀵嗙爜閿欒");
+        }
+        if (SecurityUtils.matchesPassword(newPassword, password))
+        {
+            return R.fail("鏂板瘑鐮佷笉鑳戒笌鏃у瘑鐮佺浉鍚�");
+        }
+        newPassword = SecurityUtils.encryptPassword(newPassword);
+        if (userService.resetUserPwd(userName, newPassword) > 0)
+        {
+            // 鏇存柊缂撳瓨鐢ㄦ埛瀵嗙爜
+            loginUser.getUser().setPassword(newPassword);
+            tokenService.setLoginUser(loginUser);
+            return R.ok();
+        }
+        return R.fail("淇敼瀵嗙爜寮傚父锛岃鑱旂郴绠$悊鍛�");
+    }
+
+    /**
+     * 澶村儚涓婁紶
+     */
+    @Log(title = "鐢ㄦ埛澶村儚", businessType = BusinessType.UPDATE)
+    @PostMapping("/avatar")
+    public R<?> avatar(@RequestParam("avatarfile") MultipartFile file) throws Exception
+    {
+        if (!file.isEmpty())
+        {
+            LoginUser loginUser = getLoginUser();
+            String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION);
+            if (userService.updateUserAvatar(loginUser.getUsername(), avatar))
+            {
+                // 鏇存柊缂撳瓨鐢ㄦ埛澶村儚
+                loginUser.getUser().setAvatar(avatar);
+                tokenService.setLoginUser(loginUser);
+                Map<String, Object> map = new HashMap<>();
+                map.put("imgUrl", avatar);
+                return R.ok(map);
+            }
+        }
+        return R.fail("涓婁紶鍥剧墖寮傚父锛岃鑱旂郴绠$悊鍛�");
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/project/system/controller/SysRegisterController.java b/src/main/java/com/ruoyi/project/system/controller/SysRegisterController.java
index ca7baf5..ef7cb05 100644
--- a/src/main/java/com/ruoyi/project/system/controller/SysRegisterController.java
+++ b/src/main/java/com/ruoyi/project/system/controller/SysRegisterController.java
@@ -1,33 +1,33 @@
-package com.ruoyi.project.system.controller;
-
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.framework.security.RegisterBody;
-import com.ruoyi.framework.security.service.SysRegisterService;
-import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.project.system.service.ISysConfigService;
-import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * 娉ㄥ唽楠岃瘉
- *
- * @author ruoyi
- */
-@RestController
-@AllArgsConstructor
-public class SysRegisterController extends BaseController {
-    private SysRegisterService registerService;
-    private ISysConfigService configService;
-
-    @PostMapping("/register")
-    public AjaxResult register(@RequestBody RegisterBody user) {
-        if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) {
-            return error("褰撳墠绯荤粺娌℃湁寮�鍚敞鍐屽姛鑳斤紒");
-        }
-        String msg = registerService.register(user);
-        return StringUtils.isEmpty(msg) ? success() : error(msg);
-    }
-}
+package com.ruoyi.project.system.controller;
+
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.framework.security.RegisterBody;
+import com.ruoyi.framework.security.service.SysRegisterService;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.project.system.service.ISysConfigService;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 娉ㄥ唽楠岃瘉
+ *
+ * @author ruoyi
+ */
+@RestController
+@AllArgsConstructor
+public class SysRegisterController extends BaseController {
+    private SysRegisterService registerService;
+    private ISysConfigService configService;
+
+    @PostMapping("/register")
+    public R<?> register(@RequestBody RegisterBody user) {
+        if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) {
+            return R.fail("褰撳墠绯荤粺娌℃湁寮�鍚敞鍐屽姛鑳斤紒");
+        }
+        String msg = registerService.register(user);
+        return StringUtils.isEmpty(msg) ? R.ok() : R.fail(msg);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/project/system/controller/SysRoleController.java b/src/main/java/com/ruoyi/project/system/controller/SysRoleController.java
index 3b05811..650a3e3 100644
--- a/src/main/java/com/ruoyi/project/system/controller/SysRoleController.java
+++ b/src/main/java/com/ruoyi/project/system/controller/SysRoleController.java
@@ -1,255 +1,265 @@
-package com.ruoyi.project.system.controller;
-
-import java.util.List;
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.AllArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-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.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.security.service.SysPermissionService;
-import com.ruoyi.framework.security.service.TokenService;
-import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.framework.web.page.TableDataInfo;
-import com.ruoyi.project.system.domain.SysDept;
-import com.ruoyi.project.system.domain.SysRole;
-import com.ruoyi.project.system.domain.SysUser;
-import com.ruoyi.project.system.domain.SysUserRole;
-import com.ruoyi.project.system.service.ISysDeptService;
-import com.ruoyi.project.system.service.ISysRoleService;
-import com.ruoyi.project.system.service.ISysUserService;
-
-/**
- * 瑙掕壊淇℃伅
- * 
- * @author ruoyi
- */
-@RestController
-@RequestMapping("/system/role")
-@AllArgsConstructor
-public class SysRoleController extends BaseController
-{
-    private ISysRoleService roleService;
-    private TokenService tokenService;
-    private SysPermissionService permissionService;
-    private ISysUserService userService;
-    private ISysDeptService deptService;
-
-    @PreAuthorize("@ss.hasPermi('system:role:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(SysRole role)
-    {
-        startPage();
-        List<SysRole> list = roleService.selectRoleList(role);
-        return getDataTable(list);
-    }
-
-    @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.EXPORT)
-    @PreAuthorize("@ss.hasPermi('system:role:export')")
-    @PostMapping("/export")
-    public void export(HttpServletResponse response, SysRole role)
-    {
-        List<SysRole> list = roleService.selectRoleList(role);
-        ExcelUtil<SysRole> util = new ExcelUtil<SysRole>(SysRole.class);
-        util.exportExcel(response, list, "瑙掕壊鏁版嵁");
-    }
-
-    /**
-     * 鏍规嵁瑙掕壊缂栧彿鑾峰彇璇︾粏淇℃伅
-     */
-    @PreAuthorize("@ss.hasPermi('system:role:query')")
-    @GetMapping(value = "/{roleId}")
-    public AjaxResult getInfo(@PathVariable Long roleId)
-    {
-        roleService.checkRoleDataScope(roleId);
-        return success(roleService.selectRoleById(roleId));
-    }
-
-    /**
-     * 鏂板瑙掕壊
-     */
-    @PreAuthorize("@ss.hasPermi('system:role:add')")
-    @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.INSERT)
-    @PostMapping
-    public AjaxResult add(@Validated @RequestBody SysRole role)
-    {
-        if (!roleService.checkRoleNameUnique(role))
-        {
-            return error("鏂板瑙掕壊'" + role.getRoleName() + "'澶辫触锛岃鑹插悕绉板凡瀛樺湪");
-        }
-        else if (!roleService.checkRoleKeyUnique(role))
-        {
-            return error("鏂板瑙掕壊'" + role.getRoleName() + "'澶辫触锛岃鑹叉潈闄愬凡瀛樺湪");
-        }
-        role.setCreateBy(getUsername());
-        return toAjax(roleService.insertRole(role));
-
-    }
-
-    /**
-     * 淇敼淇濆瓨瑙掕壊
-     */
-    @PreAuthorize("@ss.hasPermi('system:role:edit')")
-    @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult edit(@Validated @RequestBody SysRole role)
-    {
-        roleService.checkRoleAllowed(role);
-        roleService.checkRoleDataScope(role.getRoleId());
-        if (!roleService.checkRoleNameUnique(role))
-        {
-            return error("淇敼瑙掕壊'" + role.getRoleName() + "'澶辫触锛岃鑹插悕绉板凡瀛樺湪");
-        }
-        else if (!roleService.checkRoleKeyUnique(role))
-        {
-            return error("淇敼瑙掕壊'" + role.getRoleName() + "'澶辫触锛岃鑹叉潈闄愬凡瀛樺湪");
-        }
-        role.setUpdateBy(getUsername());
-        
-        if (roleService.updateRole(role) > 0)
-        {
-            // 鏇存柊缂撳瓨鐢ㄦ埛鏉冮檺
-            LoginUser loginUser = getLoginUser();
-            if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin())
-            {
-                loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName()));
-                loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser()));
-                tokenService.setLoginUser(loginUser);
-            }
-            return success();
-        }
-        return error("淇敼瑙掕壊'" + role.getRoleName() + "'澶辫触锛岃鑱旂郴绠$悊鍛�");
-    }
-
-    /**
-     * 淇敼淇濆瓨鏁版嵁鏉冮檺
-     */
-    @PreAuthorize("@ss.hasPermi('system:role:edit')")
-    @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.UPDATE)
-    @PutMapping("/dataScope")
-    public AjaxResult dataScope(@RequestBody SysRole role)
-    {
-        roleService.checkRoleAllowed(role);
-        roleService.checkRoleDataScope(role.getRoleId());
-        return toAjax(roleService.authDataScope(role));
-    }
-
-    /**
-     * 鐘舵�佷慨鏀�
-     */
-    @PreAuthorize("@ss.hasPermi('system:role:edit')")
-    @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.UPDATE)
-    @PutMapping("/changeStatus")
-    public AjaxResult changeStatus(@RequestBody SysRole role)
-    {
-        roleService.checkRoleAllowed(role);
-        roleService.checkRoleDataScope(role.getRoleId());
-        role.setUpdateBy(getUsername());
-        return toAjax(roleService.updateRoleStatus(role));
-    }
-
-    /**
-     * 鍒犻櫎瑙掕壊
-     */
-    @PreAuthorize("@ss.hasPermi('system:role:remove')")
-    @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{roleIds}")
-    public AjaxResult remove(@PathVariable Long[] roleIds)
-    {
-        return toAjax(roleService.deleteRoleByIds(roleIds));
-    }
-
-    /**
-     * 鑾峰彇瑙掕壊閫夋嫨妗嗗垪琛�
-     */
-    @PreAuthorize("@ss.hasPermi('system:role:query')")
-    @GetMapping("/optionselect")
-    public AjaxResult optionselect()
-    {
-        return success(roleService.selectRoleAll());
-    }
-
-    /**
-     * 鏌ヨ宸插垎閰嶇敤鎴疯鑹插垪琛�
-     */
-    @PreAuthorize("@ss.hasPermi('system:role:list')")
-    @GetMapping("/authUser/allocatedList")
-    public TableDataInfo allocatedList(SysUser user)
-    {
-        startPage();
-        List<SysUser> list = userService.selectAllocatedList(user);
-        return getDataTable(list);
-    }
-
-    /**
-     * 鏌ヨ鏈垎閰嶇敤鎴疯鑹插垪琛�
-     */
-    @PreAuthorize("@ss.hasPermi('system:role:list')")
-    @GetMapping("/authUser/unallocatedList")
-    public TableDataInfo unallocatedList(SysUser user)
-    {
-        startPage();
-        List<SysUser> list = userService.selectUnallocatedList(user);
-        return getDataTable(list);
-    }
-
-    /**
-     * 鍙栨秷鎺堟潈鐢ㄦ埛
-     */
-    @PreAuthorize("@ss.hasPermi('system:role:edit')")
-    @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.GRANT)
-    @PutMapping("/authUser/cancel")
-    public AjaxResult cancelAuthUser(@RequestBody SysUserRole userRole)
-    {
-        return toAjax(roleService.deleteAuthUser(userRole));
-    }
-
-    /**
-     * 鎵归噺鍙栨秷鎺堟潈鐢ㄦ埛
-     */
-    @PreAuthorize("@ss.hasPermi('system:role:edit')")
-    @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.GRANT)
-    @PutMapping("/authUser/cancelAll")
-    public AjaxResult cancelAuthUserAll(Long roleId, Long[] userIds)
-    {
-        return toAjax(roleService.deleteAuthUsers(roleId, userIds));
-    }
-
-    /**
-     * 鎵归噺閫夋嫨鐢ㄦ埛鎺堟潈
-     */
-    @PreAuthorize("@ss.hasPermi('system:role:edit')")
-    @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.GRANT)
-    @PutMapping("/authUser/selectAll")
-    public AjaxResult selectAuthUserAll(Long roleId, Long[] userIds)
-    {
-        roleService.checkRoleDataScope(roleId);
-        return toAjax(roleService.insertAuthUsers(roleId, userIds));
-    }
-
-    /**
-     * 鑾峰彇瀵瑰簲瑙掕壊閮ㄩ棬鏍戝垪琛�
-     */
-    @PreAuthorize("@ss.hasPermi('system:role:query')")
-    @GetMapping(value = "/deptTree/{roleId}")
-    public AjaxResult deptTree(@PathVariable("roleId") Long roleId)
-    {
-        AjaxResult ajax = AjaxResult.success();
-        ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId));
-        ajax.put("depts", deptService.selectDeptTreeList(new SysDept()));
-        return ajax;
-    }
-}
+package com.ruoyi.project.system.controller;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import jakarta.servlet.http.HttpServletResponse;
+
+import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.project.system.domain.vo.SysUserDeptVo;
+import com.ruoyi.project.system.mapper.SysUserMapper;
+import com.ruoyi.project.system.service.*;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.ArrayUtils;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+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.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.security.service.SysPermissionService;
+import com.ruoyi.framework.security.service.TokenService;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.page.TableDataInfo;
+import com.ruoyi.project.system.domain.SysDept;
+import com.ruoyi.project.system.domain.SysRole;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.domain.SysUserRole;
+
+/**
+ * 瑙掕壊淇℃伅
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/system/role")
+@AllArgsConstructor
+public class SysRoleController extends BaseController
+{
+    private ISysRoleService roleService;
+    private TokenService tokenService;
+    private SysPermissionService permissionService;
+    private ISysUserService userService;
+    private ISysDeptService deptService;
+
+    @PreAuthorize("@ss.hasPermi('system:role:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysRole role)
+    {
+        startPage();
+        List<SysRole> list = roleService.selectRoleList(role);
+        return getDataTable(list);
+    }
+
+    @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('system:role:export')")
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, SysRole role)
+    {
+        List<SysRole> list = roleService.selectRoleList(role);
+        ExcelUtil<SysRole> util = new ExcelUtil<SysRole>(SysRole.class);
+        util.exportExcel(response, list, "瑙掕壊鏁版嵁");
+    }
+
+    /**
+     * 鏍规嵁瑙掕壊缂栧彿鑾峰彇璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('system:role:query')")
+    @GetMapping(value = "/{roleId}")
+    public R<?> getInfo(@PathVariable Long roleId)
+    {
+        roleService.checkRoleDataScope(roleId);
+        return R.ok(roleService.selectRoleById(roleId));
+    }
+
+    /**
+     * 鏂板瑙掕壊
+     */
+    @PreAuthorize("@ss.hasPermi('system:role:add')")
+    @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.INSERT)
+    @PostMapping
+    public R<?> add(@Validated @RequestBody SysRole role)
+    {
+        if (!roleService.checkRoleNameUnique(role))
+        {
+            return R.fail("鏂板瑙掕壊'" + role.getRoleName() + "'澶辫触锛岃鑹插悕绉板凡瀛樺湪");
+        }
+        else if (!roleService.checkRoleKeyUnique(role))
+        {
+            return R.fail("鏂板瑙掕壊'" + role.getRoleName() + "'澶辫触锛岃鑹叉潈闄愬凡瀛樺湪");
+        }
+        role.setCreateBy(getUsername());
+        roleService.insertRole(role);
+        return R.ok();
+
+    }
+
+    /**
+     * 淇敼淇濆瓨瑙掕壊
+     */
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
+    @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public R<?> edit(@Validated @RequestBody SysRole role)
+    {
+        roleService.checkRoleAllowed(role);
+        roleService.checkRoleDataScope(role.getRoleId());
+        if (!roleService.checkRoleNameUnique(role))
+        {
+            return R.fail("淇敼瑙掕壊'" + role.getRoleName() + "'澶辫触锛岃鑹插悕绉板凡瀛樺湪");
+        }
+        else if (!roleService.checkRoleKeyUnique(role))
+        {
+            return R.fail("淇敼瑙掕壊'" + role.getRoleName() + "'澶辫触锛岃鑹叉潈闄愬凡瀛樺湪");
+        }
+        role.setUpdateBy(getUsername());
+
+        if (roleService.updateRole(role) > 0)
+        {
+            // 鏇存柊缂撳瓨鐢ㄦ埛鏉冮檺
+            LoginUser loginUser = getLoginUser();
+            if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin())
+            {
+                loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName()));
+                loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser()));
+                tokenService.setLoginUser(loginUser);
+            }
+            return R.ok();
+        }
+        return R.fail("淇敼瑙掕壊'" + role.getRoleName() + "'澶辫触锛岃鑱旂郴绠$悊鍛�");
+    }
+
+    /**
+     * 淇敼淇濆瓨鏁版嵁鏉冮檺
+     */
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
+    @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.UPDATE)
+    @PutMapping("/dataScope")
+    public R<?> dataScope(@RequestBody SysRole role)
+    {
+        roleService.checkRoleAllowed(role);
+        roleService.checkRoleDataScope(role.getRoleId());
+        roleService.authDataScope(role);
+        return R.ok();
+    }
+
+    /**
+     * 鐘舵�佷慨鏀�
+     */
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
+    @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.UPDATE)
+    @PutMapping("/changeStatus")
+    public R<?> changeStatus(@RequestBody SysRole role)
+    {
+        roleService.checkRoleAllowed(role);
+        roleService.checkRoleDataScope(role.getRoleId());
+        role.setUpdateBy(getUsername());
+        roleService.updateRoleStatus(role);
+        return R.ok();
+    }
+
+    /**
+     * 鍒犻櫎瑙掕壊
+     */
+    @PreAuthorize("@ss.hasPermi('system:role:remove')")
+    @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{roleIds}")
+    public R<?> remove(@PathVariable Long[] roleIds)
+    {
+        roleService.deleteRoleByIds(roleIds);
+        return R.ok();
+    }
+
+    /**
+     * 鑾峰彇瑙掕壊閫夋嫨妗嗗垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('system:role:query')")
+    @GetMapping("/optionselect")
+    public R<?> optionselect()
+    {
+        return R.ok(roleService.selectRoleAll());
+    }
+
+    /**
+     * 鏌ヨ宸插垎閰嶇敤鎴疯鑹插垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('system:role:list')")
+    @GetMapping("/authUser/allocatedList")
+    public TableDataInfo allocatedList(SysUser user)
+    {
+        startPage();
+        List<SysUser> list = userService.selectAllocatedList(user);
+        return getDataTable(list);
+    }
+
+    /**
+     * 鏌ヨ鏈垎閰嶇敤鎴疯鑹插垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('system:role:list')")
+    @GetMapping("/authUser/unallocatedList")
+    public TableDataInfo unallocatedList(SysUser user)
+    {
+        startPage();
+        List<SysUser> list = userService.selectUnallocatedList(user);
+        return getDataTable(list);
+    }
+
+    /**
+     * 鍙栨秷鎺堟潈鐢ㄦ埛
+     */
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
+    @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.GRANT)
+    @PutMapping("/authUser/cancel")
+    public R<?> cancelAuthUser(@RequestBody SysUserRole userRole)
+    {
+        roleService.deleteAuthUser(userRole);
+        return R.ok();
+    }
+
+    /**
+     * 鎵归噺鍙栨秷鎺堟潈鐢ㄦ埛
+     */
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
+    @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.GRANT)
+    @PutMapping("/authUser/cancelAll")
+    public R<?> cancelAuthUserAll(Long roleId, Long[] userIds)
+    {
+        roleService.deleteAuthUsers(roleId, userIds);
+        return R.ok();
+    }
+
+    /**
+     * 鎵归噺閫夋嫨鐢ㄦ埛鎺堟潈
+     */
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
+    @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.GRANT)
+    @PutMapping("/authUser/selectAll")
+    public R<?> selectAuthUserAll(Long roleId, Long[] userIds)
+    {
+        roleService.checkRoleDataScope(roleId);
+        roleService.insertAuthUsers(roleId, userIds);
+        return R.ok();
+    }
+
+    /**
+     * 鑾峰彇瀵瑰簲瑙掕壊閮ㄩ棬鏍戝垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('system:role:query')")
+    @GetMapping(value = "/deptTree/{roleId}")
+    public R<?> deptTree(@PathVariable("roleId") Long roleId)
+    {
+        Map<String, Object> map = new HashMap<>();
+        map.put("checkedKeys", deptService.selectDeptListByRoleId(roleId));
+        map.put("depts", deptService.selectDeptTreeList(new SysDept()));
+        return R.ok(map);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/project/system/controller/SysUserClientController.java b/src/main/java/com/ruoyi/project/system/controller/SysUserClientController.java
index cb921a0..f6a2732 100644
--- a/src/main/java/com/ruoyi/project/system/controller/SysUserClientController.java
+++ b/src/main/java/com/ruoyi/project/system/controller/SysUserClientController.java
@@ -2,15 +2,13 @@
 
 import com.ruoyi.framework.security.LoginUser;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.project.system.domain.GetuiConfig;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.project.system.domain.SysUserClient;
 import com.ruoyi.project.system.service.SysUserClientService;
 import com.ruoyi.common.utils.SecurityUtils;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.AllArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -36,10 +34,10 @@
      */
     @PostMapping("/addOrUpdateClientId")
     @Operation(summary = "娣诲姞/鏇存柊鐢ㄦ埛cid")
-    public AjaxResult addOrUpdateClientId(@RequestBody SysUserClient sysUserClient) {
+    public R<?> addOrUpdateClientId(@RequestBody SysUserClient sysUserClient) {
         Long userId = SecurityUtils.getUserId();
         sysUserClient.setUserId(userId);
         boolean result = sysUserClientService.addOrUpdateClientId(sysUserClient);
-        return result ? success() : error("璁惧缁戝畾澶辫触");
+        return result ? R.ok() : R.fail("璁惧缁戝畾澶辫触");
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/project/system/controller/SysUserController.java b/src/main/java/com/ruoyi/project/system/controller/SysUserController.java
index 332d6b5..84f9214 100644
--- a/src/main/java/com/ruoyi/project/system/controller/SysUserController.java
+++ b/src/main/java/com/ruoyi/project/system/controller/SysUserController.java
@@ -1,292 +1,285 @@
-package com.ruoyi.project.system.controller;
-
-import java.util.List;
-import java.util.stream.Collectors;
-import jakarta.servlet.http.HttpServletResponse;
-
-import com.ruoyi.project.system.domain.vo.SysUserDeptVo;
-import com.ruoyi.project.system.mapper.SysUserMapper;
-import com.ruoyi.project.system.service.*;
-import lombok.AllArgsConstructor;
-import org.apache.commons.lang3.ArrayUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.multipart.MultipartFile;
-import com.ruoyi.common.utils.SecurityUtils;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.framework.aspectj.lang.annotation.Log;
-import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
-import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.framework.web.page.TableDataInfo;
-import com.ruoyi.project.system.domain.SysDept;
-import com.ruoyi.project.system.domain.SysRole;
-import com.ruoyi.project.system.domain.SysUser;
-
-/**
- * 鐢ㄦ埛淇℃伅
- * 
- * @author ruoyi
- */
-@RestController
-@RequestMapping("/system/user")
-@AllArgsConstructor
-public class SysUserController extends BaseController
-{
-    private ISysUserService userService;
-    private ISysRoleService roleService;
-    private ISysDeptService deptService;
-    private ISysPostService postService;
-    private ISysUserDeptService userDeptService;
-
-    /**
-     * 鑾峰彇鐢ㄦ埛鍒楄〃
-     */
-    @PreAuthorize("@ss.hasPermi('system:user:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(SysUser user)
-    {
-        startPage();
-        List<SysUser> list = userService.selectUserList(user);
-        return getDataTable(list);
-    }
-
-    /**
-     * 鑾峰彇鐢ㄦ埛鍒楄〃
-     */
-    @PreAuthorize("@ss.hasPermi('system:user:list')")
-    @GetMapping("/listAll")
-    public AjaxResult listAll(SysUser user)
-    {
-        List<SysUser> list = userService.selectUserList(user);
-        return AjaxResult.success(list);
-    }
-
-    @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.EXPORT)
-    @PreAuthorize("@ss.hasPermi('system:user:export')")
-    @PostMapping("/export")
-    public void export(HttpServletResponse response, SysUser user)
-    {
-        List<SysUser> list = userService.selectUserList(user);
-        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
-        util.exportExcel(response, list, "鐢ㄦ埛鏁版嵁");
-    }
-
-    @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.IMPORT)
-    @PreAuthorize("@ss.hasPermi('system:user:import')")
-    @PostMapping("/importData")
-    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
-    {
-        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
-        List<SysUser> userList = util.importExcel(file.getInputStream());
-        String operName = getUsername();
-        String message = userService.importUser(userList, updateSupport, operName);
-        return success(message);
-    }
-
-    @PostMapping("/importTemplate")
-    public void importTemplate(HttpServletResponse response)
-    {
-        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
-        util.importTemplateExcel(response, "鐢ㄦ埛鏁版嵁");
-    }
-
-    /**
-     * 鏍规嵁鐢ㄦ埛缂栧彿鑾峰彇璇︾粏淇℃伅
-     */
-    @PreAuthorize("@ss.hasPermi('system:user:query')")
-    @GetMapping(value = { "/", "/{userId}" })
-    public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId)
-    {
-        AjaxResult ajax = AjaxResult.success();
-        if (StringUtils.isNotNull(userId))
-        {
-            userService.checkUserDataScope(userId);
-            SysUser sysUser = userService.selectUserById(userId);
-            ajax.put(AjaxResult.DATA_TAG, sysUser);
-            ajax.put("postIds", postService.selectPostListByUserId(userId));
-            ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList()));
-        }
-        List<SysRole> roles = roleService.selectRoleAll();
-        ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
-        ajax.put("posts", postService.selectPostAll());
-        SysUserDeptVo sysUserDeptVo = new SysUserDeptVo();
-        sysUserDeptVo.setUserId(userId);
-        List<SysUserDeptVo> sysUserDeptVos = userDeptService.userLoginFacotryList(sysUserDeptVo);
-        ajax.put("deptIds",sysUserDeptVos.stream().map(SysUserDeptVo::getDeptId).collect(Collectors.toList()));
-        return ajax;
-    }
-
-    /**
-     * 鏂板鐢ㄦ埛
-     */
-    @PreAuthorize("@ss.hasPermi('system:user:add')")
-    @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.INSERT)
-    @PostMapping
-    public AjaxResult add(@Validated @RequestBody SysUser user)
-    {
-        roleService.checkRoleDataScope(user.getRoleIds());
-        if (!userService.checkUserNameUnique(user))
-        {
-            return error("鏂板鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛岀櫥褰曡处鍙峰凡瀛樺湪");
-        }
-        else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
-        {
-            return error("鏂板鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛屾墜鏈哄彿鐮佸凡瀛樺湪");
-        }
-        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
-        {
-            return error("鏂板鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛岄偖绠辫处鍙峰凡瀛樺湪");
-        }
-        user.setCreateBy(getUsername());
-        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
-        user.setTenantId(user.getDeptId());
-        return toAjax(userService.insertUser(user));
-    }
-
-    /**
-     * 淇敼鐢ㄦ埛
-     */
-    @PreAuthorize("@ss.hasPermi('system:user:edit')")
-    @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult edit(@Validated @RequestBody SysUser user)
-    {
-        userService.checkUserAllowed(user);
-        userService.checkUserDataScope(user.getUserId());
-        roleService.checkRoleDataScope(user.getRoleIds());
-        if (!userService.checkUserNameUnique(user))
-        {
-            return error("淇敼鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛岀櫥褰曡处鍙峰凡瀛樺湪");
-        }
-        else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
-        {
-            return error("淇敼鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛屾墜鏈哄彿鐮佸凡瀛樺湪");
-        }
-        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
-        {
-            return error("淇敼鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛岄偖绠辫处鍙峰凡瀛樺湪");
-        }
-        user.setUpdateBy(getUsername());
-        userService.bindUserDept(user);
-        return toAjax(userService.updateUser(user));
-    }
-
-    /**
-     * 鍒犻櫎鐢ㄦ埛
-     */
-    @PreAuthorize("@ss.hasPermi('system:user:remove')")
-    @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{userIds}")
-    public AjaxResult remove(@PathVariable Long[] userIds)
-    {
-        if (ArrayUtils.contains(userIds, getUserId()))
-        {
-            return error("褰撳墠鐢ㄦ埛涓嶈兘鍒犻櫎");
-        }
-        return toAjax(userService.deleteUserByIds(userIds));
-    }
-
-    /**
-     * 閲嶇疆瀵嗙爜
-     */
-    @PreAuthorize("@ss.hasPermi('system:user:resetPwd')")
-    @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.UPDATE)
-    @PutMapping("/resetPwd")
-    public AjaxResult resetPwd(@RequestBody SysUser user)
-    {
-        userService.checkUserAllowed(user);
-        userService.checkUserDataScope(user.getUserId());
-        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
-        user.setUpdateBy(getUsername());
-        return toAjax(userService.resetPwd(user));
-    }
-
-    /**
-     * 鐘舵�佷慨鏀�
-     */
-    @PreAuthorize("@ss.hasPermi('system:user:edit')")
-    @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.UPDATE)
-    @PutMapping("/changeStatus")
-    public AjaxResult changeStatus(@RequestBody SysUser user)
-    {
-        userService.checkUserAllowed(user);
-        userService.checkUserDataScope(user.getUserId());
-        user.setUpdateBy(getUsername());
-        return toAjax(userService.updateUserStatus(user));
-    }
-
-    /**
-     * 鏍规嵁鐢ㄦ埛缂栧彿鑾峰彇鎺堟潈瑙掕壊
-     */
-    @PreAuthorize("@ss.hasPermi('system:user:query')")
-    @GetMapping("/authRole/{userId}")
-    public AjaxResult authRole(@PathVariable("userId") Long userId)
-    {
-        AjaxResult ajax = AjaxResult.success();
-        SysUser user = userService.selectUserById(userId);
-        List<SysRole> roles = roleService.selectRolesByUserId(userId);
-        ajax.put("user", user);
-        ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
-        return ajax;
-    }
-
-    /**
-     * 鐢ㄦ埛鎺堟潈瑙掕壊
-     */
-    @PreAuthorize("@ss.hasPermi('system:user:edit')")
-    @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.GRANT)
-    @PutMapping("/authRole")
-    public AjaxResult insertAuthRole(Long userId, Long[] roleIds)
-    {
-        userService.checkUserDataScope(userId);
-        roleService.checkRoleDataScope(roleIds);
-        userService.insertUserAuth(userId, roleIds);
-        return success();
-    }
-
-    /**
-     * 鑾峰彇閮ㄩ棬鏍戝垪琛�
-     */
-    @PreAuthorize("@ss.hasPermi('system:user:list')")
-    @GetMapping("/deptTree")
-    public AjaxResult deptTree(SysDept dept)
-    {
-        return success(deptService.selectDeptTreeList(dept));
-    }
-
-    /**
-     * 涓嶅垎椤电敤鎴锋煡璇�
-     * @param user
-     * @return
-     */
-    @GetMapping("/userListNoPage")
-    public AjaxResult userListNoPage(SysUser user){
-        List<SysUser> sysUserList = userService.userListNoPage(user);
-        return AjaxResult.success(sysUserList);
-    }
-
-    /**
-     * 鏌ヨ褰撳墠鐢ㄦ埛鍏徃涓嬫墍鏈夌敤鎴�
-     * @param user
-     * @return
-     */
-    @GetMapping("/userListNoPageByTenantId")
-    public AjaxResult userListNoPageByTenantId(SysUser user){
-        //鑾峰彇鐧诲綍鐢ㄦ埛淇℃伅
-        SysUser loginUser = SecurityUtils.getLoginUser().getUser();
-        user.setTenantId(loginUser.getTenantId());
-        List<SysUser> sysUserList = userService.userListNoPage(user);
-        return AjaxResult.success(sysUserList);
-    }
-}
+package com.ruoyi.project.system.controller;
+
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
+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.framework.web.page.TableDataInfo;
+import com.ruoyi.project.system.domain.SysDept;
+import com.ruoyi.project.system.domain.SysRole;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.domain.vo.SysUserDeptVo;
+import com.ruoyi.project.system.service.*;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.ArrayUtils;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 鐢ㄦ埛淇℃伅
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/system/user")
+@AllArgsConstructor
+public class SysUserController extends BaseController
+{
+    private ISysUserService userService;
+    private ISysRoleService roleService;
+    private ISysDeptService deptService;
+    private ISysPostService postService;
+    private ISysUserDeptService userDeptService;
+
+    /**
+     * 鑾峰彇鐢ㄦ埛鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('system:user:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysUser user)
+    {
+        startPage();
+        List<SysUser> list = userService.selectUserList(user);
+        return getDataTable(list);
+    }
+
+    /**
+     * 鑾峰彇鐢ㄦ埛鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('system:user:list')")
+    @GetMapping("/listAll")
+    public R<?> listAll(SysUser user)
+    {
+        List<SysUser> list = userService.selectUserList(user);
+        return R.ok(list);
+    }
+
+    @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('system:user:export')")
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, SysUser user)
+    {
+        List<SysUser> list = userService.selectUserList(user);
+        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
+        util.exportExcel(response, list, "鐢ㄦ埛鏁版嵁");
+    }
+
+    @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.IMPORT)
+    @PreAuthorize("@ss.hasPermi('system:user:import')")
+    @PostMapping("/importData")
+    public R<?> importData(MultipartFile file, boolean updateSupport) throws Exception
+    {
+        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
+        List<SysUser> userList = util.importExcel(file.getInputStream());
+        String operName = getUsername();
+        String message = userService.importUser(userList, updateSupport, operName);
+        return R.ok(null, message);
+    }
+
+    @PostMapping("/importTemplate")
+    public void importTemplate(HttpServletResponse response)
+    {
+        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
+        util.importTemplateExcel(response, "鐢ㄦ埛鏁版嵁");
+    }
+
+    /**
+     * 鏍规嵁鐢ㄦ埛缂栧彿鑾峰彇璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('system:user:query')")
+    @GetMapping(value = { "/", "/{userId}" })
+    public R<?> getInfo(@PathVariable(value = "userId", required = false) Long userId)
+    {
+        Map<String, Object> map = new HashMap<>();
+        if (StringUtils.isNotNull(userId))
+        {
+            userService.checkUserDataScope(userId);
+            SysUser sysUser = userService.selectUserById(userId);
+            map.put("data", sysUser);
+            map.put("postIds", postService.selectPostListByUserId(userId));
+            map.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList()));
+        }
+        List<SysRole> roles = roleService.selectRoleAll();
+        map.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
+        map.put("posts", postService.selectPostAll());
+        SysUserDeptVo sysUserDeptVo = new SysUserDeptVo();
+        sysUserDeptVo.setUserId(userId);
+        List<SysUserDeptVo> sysUserDeptVos = userDeptService.userLoginFacotryList(sysUserDeptVo);
+        map.put("deptIds",sysUserDeptVos.stream().map(SysUserDeptVo::getDeptId).collect(Collectors.toList()));
+        return R.ok(map);
+    }
+
+    /**
+     * 鏂板鐢ㄦ埛
+     */
+    @PreAuthorize("@ss.hasPermi('system:user:add')")
+    @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.INSERT)
+    @PostMapping
+    public R<?> add(@Validated @RequestBody SysUser user)
+    {
+        roleService.checkRoleDataScope(user.getRoleIds());
+        if (!userService.checkUserNameUnique(user))
+        {
+            return R.fail("鏂板鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛岀櫥褰曡处鍙峰凡瀛樺湪");
+        }
+        else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
+        {
+            return R.fail("鏂板鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛屾墜鏈哄彿鐮佸凡瀛樺湪");
+        }
+        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
+        {
+            return R.fail("鏂板鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛岄偖绠辫处鍙峰凡瀛樺湪");
+        }
+        user.setCreateBy(getUsername());
+        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
+        user.setTenantId(user.getDeptId());
+        return R.ok(userService.insertUser(user));
+    }
+
+    /**
+     * 淇敼鐢ㄦ埛
+     */
+    @PreAuthorize("@ss.hasPermi('system:user:edit')")
+    @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public R<?> edit(@Validated @RequestBody SysUser user)
+    {
+        userService.checkUserAllowed(user);
+        userService.checkUserDataScope(user.getUserId());
+        roleService.checkRoleDataScope(user.getRoleIds());
+        if (!userService.checkUserNameUnique(user))
+        {
+            return R.fail("淇敼鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛岀櫥褰曡处鍙峰凡瀛樺湪");
+        }
+        else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
+        {
+            return R.fail("淇敼鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛屾墜鏈哄彿鐮佸凡瀛樺湪");
+        }
+        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
+        {
+            return R.fail("淇敼鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛岄偖绠辫处鍙峰凡瀛樺湪");
+        }
+        user.setUpdateBy(getUsername());
+        userService.bindUserDept(user);
+        return R.ok(userService.updateUser(user));
+    }
+
+    /**
+     * 鍒犻櫎鐢ㄦ埛
+     */
+    @PreAuthorize("@ss.hasPermi('system:user:remove')")
+    @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{userIds}")
+    public R<?> remove(@PathVariable Long[] userIds)
+    {
+        if (ArrayUtils.contains(userIds, getUserId()))
+        {
+            return R.fail("褰撳墠鐢ㄦ埛涓嶈兘鍒犻櫎");
+        }
+        return R.ok(userService.deleteUserByIds(userIds)) ;
+    }
+
+    /**
+     * 閲嶇疆瀵嗙爜
+     */
+    @PreAuthorize("@ss.hasPermi('system:user:resetPwd')")
+    @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.UPDATE)
+    @PutMapping("/resetPwd")
+    public R<?> resetPwd(@RequestBody SysUser user)
+    {
+        userService.checkUserAllowed(user);
+        userService.checkUserDataScope(user.getUserId());
+        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
+        user.setUpdateBy(getUsername());
+        return R.ok(userService.resetPwd(user));
+    }
+
+    /**
+     * 鐘舵�佷慨鏀�
+     */
+    @PreAuthorize("@ss.hasPermi('system:user:edit')")
+    @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.UPDATE)
+    @PutMapping("/changeStatus")
+    public R<?> changeStatus(@RequestBody SysUser user)
+    {
+        userService.checkUserAllowed(user);
+        userService.checkUserDataScope(user.getUserId());
+        user.setUpdateBy(getUsername());
+        return R.ok(userService.updateUserStatus(user)) ;
+    }
+
+    /**
+     * 鏍规嵁鐢ㄦ埛缂栧彿鑾峰彇鎺堟潈瑙掕壊
+     */
+    @PreAuthorize("@ss.hasPermi('system:user:query')")
+    @GetMapping("/authRole/{userId}")
+    public R<?> authRole(@PathVariable("userId") Long userId)
+    {
+        SysUser user = userService.selectUserById(userId);
+        List<SysRole> roles = roleService.selectRolesByUserId(userId);
+        Map<String, Object> map = new HashMap<>();
+        map.put("user", user);
+        map.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
+        return R.ok(map);
+    }
+
+    /**
+     * 鐢ㄦ埛鎺堟潈瑙掕壊
+     */
+    @PreAuthorize("@ss.hasPermi('system:user:edit')")
+    @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.GRANT)
+    @PutMapping("/authRole")
+    public R<?> insertAuthRole(Long userId, Long[] roleIds)
+    {
+        userService.checkUserDataScope(userId);
+        roleService.checkRoleDataScope(roleIds);
+        userService.insertUserAuth(userId, roleIds);
+        return R.ok();
+    }
+
+    /**
+     * 鑾峰彇閮ㄩ棬鏍戝垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('system:user:list')")
+    @GetMapping("/deptTree")
+    public R<?> deptTree(SysDept dept)
+    {
+        return R.ok(deptService.selectDeptTreeList(dept));
+    }
+
+    /**
+     * 涓嶅垎椤电敤鎴锋煡璇�
+     * @param user
+     * @return
+     */
+    @GetMapping("/userListNoPage")
+    public R<?> userListNoPage(SysUser user){
+        List<SysUser> sysUserList = userService.userListNoPage(user);
+        return R.ok(sysUserList);
+    }
+
+    /**
+     * 鏌ヨ褰撳墠鐢ㄦ埛鍏徃涓嬫墍鏈夌敤鎴�
+     * @param user
+     * @return
+     */
+    @GetMapping("/userListNoPageByTenantId")
+    public R<?> userListNoPageByTenantId(SysUser user){
+        //鑾峰彇鐧诲綍鐢ㄦ埛淇℃伅
+        SysUser loginUser = SecurityUtils.getLoginUser().getUser();
+        user.setTenantId(loginUser.getTenantId());
+        List<SysUser> sysUserList = userService.userListNoPage(user);
+        return R.ok(sysUserList);
+    }
+}
diff --git a/src/main/java/com/ruoyi/project/tool/gen/controller/GenController.java b/src/main/java/com/ruoyi/project/tool/gen/controller/GenController.java
index ec16cea..6b5a544 100644
--- a/src/main/java/com/ruoyi/project/tool/gen/controller/GenController.java
+++ b/src/main/java/com/ruoyi/project/tool/gen/controller/GenController.java
@@ -1,255 +1,255 @@
-package com.ruoyi.project.tool.gen.controller;
-
-import com.alibaba.druid.DbType;
-import com.alibaba.druid.sql.SQLUtils;
-import com.alibaba.druid.sql.ast.SQLStatement;
-import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement;
-import com.ruoyi.common.core.text.Convert;
-import com.ruoyi.common.utils.SecurityUtils;
-import com.ruoyi.common.utils.sql.SqlUtil;
-import com.ruoyi.framework.aspectj.lang.annotation.Log;
-import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
-import com.ruoyi.framework.config.GenConfig;
-import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.framework.web.page.TableDataInfo;
-import com.ruoyi.project.tool.gen.domain.GenTable;
-import com.ruoyi.project.tool.gen.domain.GenTableColumn;
-import com.ruoyi.project.tool.gen.service.IGenTableColumnService;
-import com.ruoyi.project.tool.gen.service.IGenTableService;
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.AllArgsConstructor;
-import org.apache.commons.io.IOUtils;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 浠g爜鐢熸垚 鎿嶄綔澶勭悊
- * 
- * @author ruoyi
- */
-@RestController
-@RequestMapping("/tool/gen")
-@AllArgsConstructor
-public class GenController extends BaseController
-{
-    private IGenTableService genTableService;
-    private IGenTableColumnService genTableColumnService;
-
-    /**
-     * 鏌ヨ浠g爜鐢熸垚鍒楄〃
-     */
-    @PreAuthorize("@ss.hasPermi('tool:gen:list')")
-    @GetMapping("/list")
-    public TableDataInfo genList(GenTable genTable)
-    {
-        startPage();
-        List<GenTable> list = genTableService.selectGenTableList(genTable);
-        return getDataTable(list);
-    }
-
-    /**
-     * 鑾峰彇浠g爜鐢熸垚淇℃伅
-     */
-    @PreAuthorize("@ss.hasPermi('tool:gen:query')")
-    @GetMapping(value = "/{talbleId}")
-    public AjaxResult getInfo(@PathVariable Long talbleId)
-    {
-        GenTable table = genTableService.selectGenTableById(talbleId);
-        List<GenTable> tables = genTableService.selectGenTableAll();
-        List<GenTableColumn> list = genTableColumnService.selectGenTableColumnListByTableId(talbleId);
-        Map<String, Object> map = new HashMap<String, Object>();
-        map.put("info", table);
-        map.put("rows", list);
-        map.put("tables", tables);
-        return success(map);
-    }
-
-    /**
-     * 鏌ヨ鏁版嵁搴撳垪琛�
-     */
-    @PreAuthorize("@ss.hasPermi('tool:gen:list')")
-    @GetMapping("/db/list")
-    public TableDataInfo dataList(GenTable genTable)
-    {
-        startPage();
-        List<GenTable> list = genTableService.selectDbTableList(genTable);
-        return getDataTable(list);
-    }
-
-    /**
-     * 鏌ヨ鏁版嵁琛ㄥ瓧娈靛垪琛�
-     */
-    @PreAuthorize("@ss.hasPermi('tool:gen:list')")
-    @GetMapping(value = "/column/{tableId}")
-    public TableDataInfo columnList(Long tableId)
-    {
-        TableDataInfo dataInfo = new TableDataInfo();
-        List<GenTableColumn> list = genTableColumnService.selectGenTableColumnListByTableId(tableId);
-        dataInfo.setRows(list);
-        dataInfo.setTotal(list.size());
-        return dataInfo;
-    }
-
-    /**
-     * 瀵煎叆琛ㄧ粨鏋勶紙淇濆瓨锛�
-     */
-    @PreAuthorize("@ss.hasPermi('tool:gen:import')")
-    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.IMPORT)
-    @PostMapping("/importTable")
-    public AjaxResult importTableSave(String tables)
-    {
-        String[] tableNames = Convert.toStrArray(tables);
-        // 鏌ヨ琛ㄤ俊鎭�
-        List<GenTable> tableList = genTableService.selectDbTableListByNames(tableNames);
-        genTableService.importGenTable(tableList, SecurityUtils.getUsername());
-        return success();
-    }
-
-    /**
-     * 鍒涘缓琛ㄧ粨鏋勶紙淇濆瓨锛�
-     */
-    @PreAuthorize("@ss.hasRole('admin')")
-    @Log(title = "鍒涘缓琛�", businessType = BusinessType.OTHER)
-    @PostMapping("/createTable")
-    public AjaxResult createTableSave(String sql)
-    {
-        try
-        {
-            SqlUtil.filterKeyword(sql);
-            List<SQLStatement> sqlStatements = SQLUtils.parseStatements(sql, DbType.mysql);
-            List<String> tableNames = new ArrayList<>();
-            for (SQLStatement sqlStatement : sqlStatements)
-            {
-                if (sqlStatement instanceof MySqlCreateTableStatement)
-                {
-                    MySqlCreateTableStatement createTableStatement = (MySqlCreateTableStatement) sqlStatement;
-                    if (genTableService.createTable(createTableStatement.toString()))
-                    {
-                        String tableName = createTableStatement.getTableName().replaceAll("`", "");
-                        tableNames.add(tableName);
-                    }
-                }
-            }
-            List<GenTable> tableList = genTableService.selectDbTableListByNames(tableNames.toArray(new String[tableNames.size()]));
-            String operName = SecurityUtils.getUsername();
-            genTableService.importGenTable(tableList, operName);
-            return AjaxResult.success();
-        }
-        catch (Exception e)
-        {
-            logger.error(e.getMessage(), e);
-            return AjaxResult.error("鍒涘缓琛ㄧ粨鏋勫紓甯�");
-        }
-    }
-
-    /**
-     * 淇敼淇濆瓨浠g爜鐢熸垚涓氬姟
-     */
-    @PreAuthorize("@ss.hasPermi('tool:gen:edit')")
-    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult editSave(@Validated @RequestBody GenTable genTable)
-    {
-        genTableService.validateEdit(genTable);
-        genTableService.updateGenTable(genTable);
-        return success();
-    }
-
-    /**
-     * 鍒犻櫎浠g爜鐢熸垚
-     */
-    @PreAuthorize("@ss.hasPermi('tool:gen:remove')")
-    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{tableIds}")
-    public AjaxResult remove(@PathVariable Long[] tableIds)
-    {
-        genTableService.deleteGenTableByIds(tableIds);
-        return success();
-    }
-
-    /**
-     * 棰勮浠g爜
-     */
-    @PreAuthorize("@ss.hasPermi('tool:gen:preview')")
-    @GetMapping("/preview/{tableId}")
-    public AjaxResult preview(@PathVariable("tableId") Long tableId) throws IOException
-    {
-        Map<String, String> dataMap = genTableService.previewCode(tableId);
-        return success(dataMap);
-    }
-
-    /**
-     * 鐢熸垚浠g爜锛堜笅杞芥柟寮忥級
-     */
-    @PreAuthorize("@ss.hasPermi('tool:gen:code')")
-    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.GENCODE)
-    @GetMapping("/download/{tableName}")
-    public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException
-    {
-        byte[] data = genTableService.downloadCode(tableName);
-        genCode(response, data);
-    }
-
-    /**
-     * 鐢熸垚浠g爜锛堣嚜瀹氫箟璺緞锛�
-     */
-    @PreAuthorize("@ss.hasPermi('tool:gen:code')")
-    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.GENCODE)
-    @GetMapping("/genCode/{tableName}")
-    public AjaxResult genCode(@PathVariable("tableName") String tableName)
-    {
-        if (!GenConfig.isAllowOverwrite())
-        {
-            return AjaxResult.error("銆愮郴缁熼璁俱�戜笉鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦�");
-        }
-        genTableService.generatorCode(tableName);
-        return success();
-    }
-
-    /**
-     * 鍚屾鏁版嵁搴�
-     */
-    @PreAuthorize("@ss.hasPermi('tool:gen:edit')")
-    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.UPDATE)
-    @GetMapping("/synchDb/{tableName}")
-    public AjaxResult synchDb(@PathVariable("tableName") String tableName)
-    {
-        genTableService.synchDb(tableName);
-        return success();
-    }
-
-    /**
-     * 鎵归噺鐢熸垚浠g爜
-     */
-    @PreAuthorize("@ss.hasPermi('tool:gen:code')")
-    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.GENCODE)
-    @GetMapping("/batchGenCode")
-    public void batchGenCode(HttpServletResponse response, String tables) throws IOException
-    {
-        String[] tableNames = Convert.toStrArray(tables);
-        byte[] data = genTableService.downloadCode(tableNames);
-        genCode(response, data);
-    }
-
-    /**
-     * 鐢熸垚zip鏂囦欢
-     */
-    private void genCode(HttpServletResponse response, byte[] data) throws IOException
-    {
-        response.reset();
-        response.addHeader("Access-Control-Allow-Origin", "*");
-        response.addHeader("Access-Control-Expose-Headers", "Content-Disposition");
-        response.setHeader("Content-Disposition", "attachment; filename=\"ruoyi.zip\"");
-        response.addHeader("Content-Length", "" + data.length);
-        response.setContentType("application/octet-stream; charset=UTF-8");
-        IOUtils.write(data, response.getOutputStream());
-    }
+package com.ruoyi.project.tool.gen.controller;
+
+import com.alibaba.druid.DbType;
+import com.alibaba.druid.sql.SQLUtils;
+import com.alibaba.druid.sql.ast.SQLStatement;
+import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement;
+import com.ruoyi.common.core.text.Convert;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.sql.SqlUtil;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
+import com.ruoyi.framework.config.GenConfig;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.framework.web.page.TableDataInfo;
+import com.ruoyi.project.tool.gen.domain.GenTable;
+import com.ruoyi.project.tool.gen.domain.GenTableColumn;
+import com.ruoyi.project.tool.gen.service.IGenTableColumnService;
+import com.ruoyi.project.tool.gen.service.IGenTableService;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.AllArgsConstructor;
+import org.apache.commons.io.IOUtils;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 浠g爜鐢熸垚 鎿嶄綔澶勭悊
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/tool/gen")
+@AllArgsConstructor
+public class GenController extends BaseController
+{
+    private IGenTableService genTableService;
+    private IGenTableColumnService genTableColumnService;
+
+    /**
+     * 鏌ヨ浠g爜鐢熸垚鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('tool:gen:list')")
+    @GetMapping("/list")
+    public TableDataInfo genList(GenTable genTable)
+    {
+        startPage();
+        List<GenTable> list = genTableService.selectGenTableList(genTable);
+        return getDataTable(list);
+    }
+
+    /**
+     * 鑾峰彇浠g爜鐢熸垚淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('tool:gen:query')")
+    @GetMapping(value = "/{talbleId}")
+    public R<?> getInfo(@PathVariable Long talbleId)
+    {
+        GenTable table = genTableService.selectGenTableById(talbleId);
+        List<GenTable> tables = genTableService.selectGenTableAll();
+        List<GenTableColumn> list = genTableColumnService.selectGenTableColumnListByTableId(talbleId);
+        Map<String, Object> map = new HashMap<String, Object>();
+        map.put("info", table);
+        map.put("rows", list);
+        map.put("tables", tables);
+        return R.ok(map);
+    }
+
+    /**
+     * 鏌ヨ鏁版嵁搴撳垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('tool:gen:list')")
+    @GetMapping("/db/list")
+    public TableDataInfo dataList(GenTable genTable)
+    {
+        startPage();
+        List<GenTable> list = genTableService.selectDbTableList(genTable);
+        return getDataTable(list);
+    }
+
+    /**
+     * 鏌ヨ鏁版嵁琛ㄥ瓧娈靛垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('tool:gen:list')")
+    @GetMapping(value = "/column/{tableId}")
+    public TableDataInfo columnList(Long tableId)
+    {
+        TableDataInfo dataInfo = new TableDataInfo();
+        List<GenTableColumn> list = genTableColumnService.selectGenTableColumnListByTableId(tableId);
+        dataInfo.setRows(list);
+        dataInfo.setTotal(list.size());
+        return dataInfo;
+    }
+
+    /**
+     * 瀵煎叆琛ㄧ粨鏋勶紙淇濆瓨锛�
+     */
+    @PreAuthorize("@ss.hasPermi('tool:gen:import')")
+    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.IMPORT)
+    @PostMapping("/importTable")
+    public R<?> importTableSave(String tables)
+    {
+        String[] tableNames = Convert.toStrArray(tables);
+        // 鏌ヨ琛ㄤ俊鎭�
+        List<GenTable> tableList = genTableService.selectDbTableListByNames(tableNames);
+        genTableService.importGenTable(tableList, SecurityUtils.getUsername());
+        return R.ok();
+    }
+
+    /**
+     * 鍒涘缓琛ㄧ粨鏋勶紙淇濆瓨锛�
+     */
+    @PreAuthorize("@ss.hasRole('admin')")
+    @Log(title = "鍒涘缓琛�", businessType = BusinessType.OTHER)
+    @PostMapping("/createTable")
+    public R<?> createTableSave(String sql)
+    {
+        try
+        {
+            SqlUtil.filterKeyword(sql);
+            List<SQLStatement> sqlStatements = SQLUtils.parseStatements(sql, DbType.mysql);
+            List<String> tableNames = new ArrayList<>();
+            for (SQLStatement sqlStatement : sqlStatements)
+            {
+                if (sqlStatement instanceof MySqlCreateTableStatement)
+                {
+                    MySqlCreateTableStatement createTableStatement = (MySqlCreateTableStatement) sqlStatement;
+                    if (genTableService.createTable(createTableStatement.toString()))
+                    {
+                        String tableName = createTableStatement.getTableName().replaceAll("`", "");
+                        tableNames.add(tableName);
+                    }
+                }
+            }
+            List<GenTable> tableList = genTableService.selectDbTableListByNames(tableNames.toArray(new String[tableNames.size()]));
+            String operName = SecurityUtils.getUsername();
+            genTableService.importGenTable(tableList, operName);
+            return R.ok();
+        }
+        catch (Exception e)
+        {
+            logger.error(e.getMessage(), e);
+            return R.fail("鍒涘缓琛ㄧ粨鏋勫紓甯�");
+        }
+    }
+
+    /**
+     * 淇敼淇濆瓨浠g爜鐢熸垚涓氬姟
+     */
+    @PreAuthorize("@ss.hasPermi('tool:gen:edit')")
+    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public R<?> editSave(@Validated @RequestBody GenTable genTable)
+    {
+        genTableService.validateEdit(genTable);
+        genTableService.updateGenTable(genTable);
+        return R.ok();
+    }
+
+    /**
+     * 鍒犻櫎浠g爜鐢熸垚
+     */
+    @PreAuthorize("@ss.hasPermi('tool:gen:remove')")
+    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{tableIds}")
+    public R<?> remove(@PathVariable Long[] tableIds)
+    {
+        genTableService.deleteGenTableByIds(tableIds);
+        return R.ok();
+    }
+
+    /**
+     * 棰勮浠g爜
+     */
+    @PreAuthorize("@ss.hasPermi('tool:gen:preview')")
+    @GetMapping("/preview/{tableId}")
+    public R<?> preview(@PathVariable("tableId") Long tableId) throws IOException
+    {
+        Map<String, String> dataMap = genTableService.previewCode(tableId);
+        return R.ok(dataMap);
+    }
+
+    /**
+     * 鐢熸垚浠g爜锛堜笅杞芥柟寮忥級
+     */
+    @PreAuthorize("@ss.hasPermi('tool:gen:code')")
+    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.GENCODE)
+    @GetMapping("/download/{tableName}")
+    public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException
+    {
+        byte[] data = genTableService.downloadCode(tableName);
+        genCode(response, data);
+    }
+
+    /**
+     * 鐢熸垚浠g爜锛堣嚜瀹氫箟璺緞锛�
+     */
+    @PreAuthorize("@ss.hasPermi('tool:gen:code')")
+    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.GENCODE)
+    @GetMapping("/genCode/{tableName}")
+    public R<?> genCode(@PathVariable("tableName") String tableName)
+    {
+        if (!GenConfig.isAllowOverwrite())
+        {
+            return R.fail("銆愮郴缁熼璁俱�戜笉鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦�");
+        }
+        genTableService.generatorCode(tableName);
+        return R.ok();
+    }
+
+    /**
+     * 鍚屾鏁版嵁搴�
+     */
+    @PreAuthorize("@ss.hasPermi('tool:gen:edit')")
+    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.UPDATE)
+    @GetMapping("/synchDb/{tableName}")
+    public R<?> synchDb(@PathVariable("tableName") String tableName)
+    {
+        genTableService.synchDb(tableName);
+        return R.ok();
+    }
+
+    /**
+     * 鎵归噺鐢熸垚浠g爜
+     */
+    @PreAuthorize("@ss.hasPermi('tool:gen:code')")
+    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.GENCODE)
+    @GetMapping("/batchGenCode")
+    public void batchGenCode(HttpServletResponse response, String tables) throws IOException
+    {
+        String[] tableNames = Convert.toStrArray(tables);
+        byte[] data = genTableService.downloadCode(tableNames);
+        genCode(response, data);
+    }
+
+    /**
+     * 鐢熸垚zip鏂囦欢
+     */
+    private void genCode(HttpServletResponse response, byte[] data) throws IOException
+    {
+        response.reset();
+        response.addHeader("Access-Control-Allow-Origin", "*");
+        response.addHeader("Access-Control-Expose-Headers", "Content-Disposition");
+        response.setHeader("Content-Disposition", "attachment; filename=\"ruoyi.zip\"");
+        response.addHeader("Content-Length", "" + data.length);
+        response.setContentType("application/octet-stream; charset=UTF-8");
+        IOUtils.write(data, response.getOutputStream());
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/projectManagement/controller/InfoController.java b/src/main/java/com/ruoyi/projectManagement/controller/InfoController.java
index 56baf0f..1acbd65 100644
--- a/src/main/java/com/ruoyi/projectManagement/controller/InfoController.java
+++ b/src/main/java/com/ruoyi/projectManagement/controller/InfoController.java
@@ -1,6 +1,7 @@
 package com.ruoyi.projectManagement.controller;
 
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.projectManagement.dto.InfoStageDto;
 import com.ruoyi.projectManagement.dto.UpdateStateInfo;
 import com.ruoyi.projectManagement.service.InfoService;
@@ -24,63 +25,63 @@
 @RequestMapping("/projectManagement/info")
 @Tag(name = "椤圭洰绠$悊淇℃伅琛�(椤圭洰绠$悊绫诲瀷)")
 @RequiredArgsConstructor
-public class InfoController {
+public class InfoController extends BaseController {
 
     private final InfoService infoService;
     private final InfoStageHandleService infoStageHandleService;
 
     @PostMapping("/save")
     @Operation(summary = "淇濆瓨")
-    public AjaxResult save(@RequestBody @Valid SaveInfoVo saveInfoVo) {
+    public R<?> save(@RequestBody @Valid SaveInfoVo saveInfoVo) {
         infoService.save(saveInfoVo);
-        return AjaxResult.success();
+        return R.ok();
     }
 
     @PostMapping("/updateStatus")
     @Operation(summary = "淇敼鐘舵��")
-    public AjaxResult updateStatus(@RequestBody @Valid UpdateStateInfo updateStateInfo){
+    public R<?> updateStatus(@RequestBody @Valid UpdateStateInfo updateStateInfo){
         infoService.updateStatus(updateStateInfo);
-        return AjaxResult.success();
+        return R.ok();
     }
 
     @PostMapping("/delete/{id}")
     @Operation(summary = "鍒犻櫎")
-    public AjaxResult delete(@PathVariable Long id) {
+    public R<?> delete(@PathVariable Long id) {
         infoService.deleteInfo(id);
-        return AjaxResult.success();
+        return R.ok();
     }
 
     @PostMapping("/listPage")
     @Operation(summary = "鍒嗛〉鍒楄〃")
-    public AjaxResult listPage(@RequestBody @Valid SearchInfoVo vo) {
-        return AjaxResult.success(infoService.searchListInfo(vo));
+    public R<?> listPage(@RequestBody @Valid SearchInfoVo vo) {
+        return R.ok(infoService.searchListInfo(vo));
     }
 
 
     @PostMapping("/{id}")
     @Operation(summary = "璇︽儏")
-    public AjaxResult getInfoById(@PathVariable Long id) {
-        return AjaxResult.success(infoService.getInfoById(id));
+    public R<?> getInfoById(@PathVariable Long id) {
+        return R.ok(infoService.getInfoById(id));
     }
 
     @PostMapping("/saveStage")
     @Operation(summary = "淇濆瓨闃舵")
-    public AjaxResult saveStage(@RequestBody @Valid SaveInfoStageVo dto) {
+    public R<?> saveStage(@RequestBody @Valid SaveInfoStageVo dto) {
         infoStageHandleService.save(dto);
-        return AjaxResult.success();
+        return R.ok();
     }
 
     @PostMapping("/listStage/{id}")
     @Operation(summary = "鍒楄〃闃舵")
-    public AjaxResult listStage(@PathVariable Long id) {
-        return AjaxResult.success(infoStageHandleService.getListVoByInfoId(id));
+    public R<?> listStage(@PathVariable Long id) {
+        return R.ok(infoStageHandleService.getListVoByInfoId(id));
     }
 
     @PostMapping("/deleteStage/{id}")
     @Operation(summary = "鍒犻櫎闃舵")
-    public AjaxResult deleteStage(@PathVariable Long id) {
+    public R<?> deleteStage(@PathVariable Long id) {
         infoStageHandleService.deleteById(id);
-        return AjaxResult.success();
+        return R.ok();
     }
 
 
diff --git a/src/main/java/com/ruoyi/projectManagement/controller/PlanController.java b/src/main/java/com/ruoyi/projectManagement/controller/PlanController.java
index c8b982c..5ec8191 100644
--- a/src/main/java/com/ruoyi/projectManagement/controller/PlanController.java
+++ b/src/main/java/com/ruoyi/projectManagement/controller/PlanController.java
@@ -1,6 +1,7 @@
 package com.ruoyi.projectManagement.controller;
 
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.projectManagement.service.PlanService;
 import com.ruoyi.projectManagement.vo.SavePlanNodeVo;
 import com.ruoyi.projectManagement.vo.SavePlanVo;
@@ -22,28 +23,28 @@
 @RequestMapping("/projectManagement/plan")
 @Tag(name = "椤圭洰绠$悊璁″垝琛�(椤圭洰绠$悊绫诲瀷)")
 @RequiredArgsConstructor
-public class PlanController {
+public class PlanController extends BaseController {
 
     private final PlanService planService;
 
     @PostMapping("/save")
     @Operation(summary = "淇濆瓨")
-    public AjaxResult save(@RequestBody @Valid SavePlanVo savePlanVo) {
+    public R<?> save(@RequestBody @Valid SavePlanVo savePlanVo) {
         planService.savePlan(savePlanVo);
-        return AjaxResult.success();
+        return R.ok();
     }
 
     @PostMapping("/delete/{id}")
     @Operation(summary = "鍒犻櫎")
-    public AjaxResult delete(@PathVariable Long id) {
+    public R<?> delete(@PathVariable Long id) {
         planService.deletePlan(id);
-        return AjaxResult.success();
+        return R.ok();
     }
 
     @PostMapping("/listPage")
     @Operation(summary = "鍒嗛〉鍒楄〃")
-    public AjaxResult listPage(@RequestBody SearchPlanVo searchPlanVo) {
-        return AjaxResult.success(planService.searchPlan(searchPlanVo));
+    public R<?> listPage(@RequestBody SearchPlanVo searchPlanVo) {
+        return R.ok(planService.searchPlan(searchPlanVo));
     }
 
 }
diff --git a/src/main/java/com/ruoyi/projectManagement/controller/RolesController.java b/src/main/java/com/ruoyi/projectManagement/controller/RolesController.java
index 8adcf8d..93fadf7 100644
--- a/src/main/java/com/ruoyi/projectManagement/controller/RolesController.java
+++ b/src/main/java/com/ruoyi/projectManagement/controller/RolesController.java
@@ -4,7 +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.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.projectManagement.dto.RoleDto;
 import com.ruoyi.projectManagement.mapper.RolesMapper;
 import com.ruoyi.projectManagement.pojo.Roles;
@@ -20,41 +21,41 @@
 @AllArgsConstructor
 @RequestMapping("/projectManagement/roles")
 @Tag(name = "")
-public class RolesController {
+public class RolesController extends BaseController {
 
     private RolesService rolesservice;
     private RolesMapper rolesMapper;
 
     @GetMapping("/listPage")
     @Operation(summary = "鍒嗛〉鏌ヨ鎵�鏈�")
-    public AjaxResult listPage(Page<Roles> page, Roles roles) {
-        return AjaxResult.success(rolesservice.listPage(page, roles));
+    public R<?> listPage(Page<Roles> page, Roles roles) {
+        return R.ok(rolesservice.listPage(page, roles));
     }
 
     @PostMapping("/add")
     @Operation(summary = "鏂板")
-    public AjaxResult add(@RequestBody RoleDto roleDto) {
+    public R<?> add(@RequestBody RoleDto roleDto) {
         if (roleDto.getIsDefaultNo()) {
             roleDto.setNo(OrderUtils.countTodayByCreateTime(rolesMapper, "XMJS","no"));
         }
-        return AjaxResult.success(rolesservice.save(roleDto));
+        return R.ok(rolesservice.save(roleDto));
     }
 
     @PostMapping("/update")
     @Operation(summary = "淇敼")
-    public AjaxResult update(@RequestBody Roles roles) {
-        return AjaxResult.success(rolesservice.updateById(roles));
+    public R<?> update(@RequestBody Roles roles) {
+        return R.ok(rolesservice.updateById(roles));
     }
 
     @DeleteMapping("/delete")
     @Operation(summary = "鍒犻櫎")
-    public AjaxResult delete(@RequestBody List<Long> ids) {
-        if (CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
-        return AjaxResult.success(rolesservice.removeBatchByIds(ids));
+    public R<?> delete(@RequestBody List<Long> ids) {
+        if (CollectionUtils.isEmpty(ids)) return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        return R.ok(rolesservice.removeBatchByIds(ids));
     }
 
     @PostMapping("/listSimpleRole")
-    public AjaxResult listSimpleRole() {
-        return AjaxResult.success(rolesservice.listSimpleRole());
+    public R<?> listSimpleRole() {
+        return R.ok(rolesservice.listSimpleRole());
     }
 }
diff --git a/src/main/java/com/ruoyi/purchase/controller/AccountingReportController.java b/src/main/java/com/ruoyi/purchase/controller/AccountingReportController.java
index 813fb44..047863c 100644
--- a/src/main/java/com/ruoyi/purchase/controller/AccountingReportController.java
+++ b/src/main/java/com/ruoyi/purchase/controller/AccountingReportController.java
@@ -5,7 +5,8 @@
 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.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.purchase.dto.InvoicePurchaseReportDto;
 import com.ruoyi.purchase.dto.VatDto;
 import com.ruoyi.purchase.pojo.InvoicePurchase;
@@ -27,15 +28,15 @@
 @Tag(name = "閲囪喘鎶ヨ〃")
 @RequestMapping("/purchase/report")
 @AllArgsConstructor
-public class AccountingReportController {
+public class AccountingReportController extends BaseController {
 
     private IInvoicePurchaseService invoicePurchaseService;
 
     @GetMapping("/list")
     @Log(title = "閲囪喘鎶ヨ〃-椤圭洰鍒╂鼎", businessType = BusinessType.OTHER)
-    public AjaxResult list(Page page, InvoicePurchaseReportDto invoicePurchaseReportDto) {
+    public R<?> list(Page page, InvoicePurchaseReportDto invoicePurchaseReportDto) {
         IPage<InvoicePurchaseReportDto> result =invoicePurchaseService.listPurchaseReport(page, invoicePurchaseReportDto);
-        return AjaxResult.success(result);
+        return R.ok(result);
     }
 
     @Log(title = "閲囪喘鎶ヨ〃-椤圭洰鍒╂鼎瀵煎嚭", businessType = BusinessType.EXPORT)
@@ -51,9 +52,9 @@
 
     @Log(title = "閲囪喘鎶ヨ〃-澧炲�肩◣姣斿", businessType = BusinessType.OTHER)
     @GetMapping("/listVat")
-    public AjaxResult listVat(Page page,String month) {
+    public R<?> listVat(Page page,String month) {
         IPage<VatDto> result = invoicePurchaseService.listVat(page, month);
-        return AjaxResult.success(result);
+        return R.ok(result);
     }
 
     @Log(title = "閲囪喘鎶ヨ〃-澧炲�肩◣姣斿", businessType = BusinessType.EXPORT)
diff --git a/src/main/java/com/ruoyi/purchase/controller/InvoicePurchaseController.java b/src/main/java/com/ruoyi/purchase/controller/InvoicePurchaseController.java
index afd9213..5bf43bf 100644
--- a/src/main/java/com/ruoyi/purchase/controller/InvoicePurchaseController.java
+++ b/src/main/java/com/ruoyi/purchase/controller/InvoicePurchaseController.java
@@ -4,7 +4,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.framework.web.page.TableDataInfo;
 import com.ruoyi.purchase.dto.InvoicePurchaseDto;
 import com.ruoyi.purchase.pojo.InvoicePurchase;
@@ -66,8 +66,9 @@
      */
     @Log(title = "鍙戠エ淇℃伅", businessType = BusinessType.INSERT)
     @PostMapping("/addOrUpdateInvoice")
-    public AjaxResult addOrUpdateInvoice(@RequestBody InvoicePurchaseDto invoicePurchaseDto) throws IOException {
-        return toAjax(invoicePurchaseService.addOrUpdateInvoice(invoicePurchaseDto));
+    public R<?> addOrUpdateInvoice(@RequestBody InvoicePurchaseDto invoicePurchaseDto) throws IOException {
+        invoicePurchaseService.addOrUpdateInvoice(invoicePurchaseDto);
+        return R.ok();
     }
 
     /**
@@ -75,8 +76,9 @@
      */
     @Log(title = "鍙戠エ淇℃伅", businessType = BusinessType.DELETE)
     @DeleteMapping("/delInvoice")
-    public AjaxResult remove(@RequestBody Long[] ids) {
-        return toAjax(invoicePurchaseService.delInvoice(ids));
+    public R<?> remove(@RequestBody Long[] ids) {
+        invoicePurchaseService.delInvoice(ids);
+        return R.ok();
     }
 
 }
diff --git a/src/main/java/com/ruoyi/purchase/controller/PaymentRegistrationController.java b/src/main/java/com/ruoyi/purchase/controller/PaymentRegistrationController.java
index 289110c..9019c61 100644
--- a/src/main/java/com/ruoyi/purchase/controller/PaymentRegistrationController.java
+++ b/src/main/java/com/ruoyi/purchase/controller/PaymentRegistrationController.java
@@ -6,7 +6,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.framework.web.page.TableDataInfo;
 import com.ruoyi.purchase.dto.PaymentHistoryRecordVo;
 import com.ruoyi.purchase.dto.PaymentLedgerDto;
@@ -62,8 +62,8 @@
      * 鑾峰彇浠樻鐧昏璇︾粏淇℃伅
      */
     @GetMapping(value = "/{id}")
-    public AjaxResult getInfo(@PathVariable("id") Long id) {
-        return success(paymentRegistrationService.selectPaymentRegistrationById(id));
+    public R<?> getInfo(@PathVariable("id") Long id) {
+        return R.ok(paymentRegistrationService.selectPaymentRegistrationById(id));
     }
 
     /**
@@ -72,8 +72,9 @@
     @Log(title = "浠樻鐧昏", businessType = BusinessType.INSERT)
     @PostMapping
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult add(@RequestBody List<PaymentRegistration>  paymentRegistration) {
-        return toAjax(paymentRegistrationService.insertPaymentRegistration(paymentRegistration));
+    public R<?> add(@RequestBody List<PaymentRegistration>  paymentRegistration) {
+        paymentRegistrationService.insertPaymentRegistration(paymentRegistration);
+        return R.ok();
     }
 
     /**
@@ -82,8 +83,9 @@
     @Log(title = "浠樻鐧昏", businessType = BusinessType.UPDATE)
     @PutMapping
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult edit(@RequestBody PaymentRegistration paymentRegistration) {
-        return toAjax(paymentRegistrationService.updatePaymentRegistration(paymentRegistration));
+    public R<?> edit(@RequestBody PaymentRegistration paymentRegistration) {
+        paymentRegistrationService.updatePaymentRegistration(paymentRegistration);
+        return R.ok();
     }
 
     /**
@@ -91,8 +93,9 @@
      */
     @Log(title = "浠樻鐧昏", businessType = BusinessType.DELETE)
     @DeleteMapping("/del")
-    public AjaxResult remove(@RequestBody Long[] ids) {
-        return toAjax(paymentRegistrationService.deletePaymentRegistrationByIds(ids));
+    public R<?> remove(@RequestBody Long[] ids) {
+        paymentRegistrationService.deletePaymentRegistrationByIds(ids);
+        return R.ok();
     }
 
     /**
@@ -100,51 +103,52 @@
      */
     @Log(title = "浠樻鐧昏", businessType = BusinessType.DELETE)
     @DeleteMapping("/delete")
-    public AjaxResult delete(@RequestBody Long[] ids) {
-        return toAjax(paymentRegistrationService.delete(ids));
+    public R<?> delete(@RequestBody Long[] ids) {
+        paymentRegistrationService.delete(ids);
+        return R.ok();
     }
 
     /**
      * 鑾峰彇浠樻鐧昏璇︾粏淇℃伅
      */
     @GetMapping(value = "/byPurchaseId/{id}")
-    public AjaxResult getPurchaseInfo(@PathVariable("id") Long id) {
-        return success(paymentRegistrationService.selectPaymentRegistrationByPurchaseId(id));
+    public R<?> getPurchaseInfo(@PathVariable("id") Long id) {
+        return R.ok(paymentRegistrationService.selectPaymentRegistrationByPurchaseId(id));
     }
 
     /**
      * 鑾峰彇浠樻鐧昏璇︾粏淇℃伅
      */
     @GetMapping(value = "/paymentLedgerList")
-    public AjaxResult paymentLedgerList(PaymentLedgerDto paymentLedgerDto, Page page,
+    public R<?> paymentLedgerList(PaymentLedgerDto paymentLedgerDto, Page page,
                                         Integer detailPageNum,
                                         Integer detailPageSize) {
         IPage<Map<String, Object>> mapIPage = paymentRegistrationService.selectPaymentLedgerList(paymentLedgerDto, page, detailPageNum, detailPageSize);
-        return success(mapIPage);
+        return R.ok(mapIPage);
     }
 
     /**
      * 渚涘簲鍟嗗線鏉ュ垎椤垫帴鍙�
      */
     @GetMapping("/supplierNameListPage")
-    public AjaxResult supplierNameListPage(PaymentLedgerDto paymentLedgerDto, Page page){
-        return success(paymentRegistrationService.supplierNameListPage(page,paymentLedgerDto));
+    public R<?> supplierNameListPage(PaymentLedgerDto paymentLedgerDto, Page page){
+        return R.ok(paymentRegistrationService.supplierNameListPage(page,paymentLedgerDto));
     }
 
     /**
      * 渚涘簲鍟嗗線鏉ュ垎椤垫帴鍙�
      */
     @GetMapping("/supplierNameListPageDetails")
-    public AjaxResult supplierNameListPageDetails(PaymentLedgerDto paymentLedgerDto){
-        return success(paymentRegistrationService.supplierNameListPageDetails(paymentLedgerDto));
+    public R<?> supplierNameListPageDetails(PaymentLedgerDto paymentLedgerDto){
+        return R.ok(paymentRegistrationService.supplierNameListPageDetails(paymentLedgerDto));
     }
 
     /**
      * 鑾峰彇鏈湀搴斾粯淇℃伅
      */
     @GetMapping(value = "/paymentMonthList")
-    public AjaxResult paymentMonthList() {
-        return success(paymentRegistrationService.paymentMonthList());
+    public R<?> paymentMonthList() {
+        return R.ok(paymentRegistrationService.paymentMonthList());
     }
 
     /**
@@ -166,9 +170,9 @@
      * @return
      */
     @GetMapping("/getPaymentRecordList/{supplierId}")
-    public AjaxResult getPaymentRecordList(@PathVariable Long supplierId) {
+    public R<?> getPaymentRecordList(@PathVariable Long supplierId) {
         List<PaymentHistoryRecordVo> paymentRecordList = paymentRegistrationService.getPaymentRecordList(supplierId);
-        return success(paymentRecordList);
+        return R.ok(paymentRecordList);
     }
 
     /**
diff --git a/src/main/java/com/ruoyi/purchase/controller/ProcurementBusinessSummaryController.java b/src/main/java/com/ruoyi/purchase/controller/ProcurementBusinessSummaryController.java
index cbdee81..949ca95 100644
--- a/src/main/java/com/ruoyi/purchase/controller/ProcurementBusinessSummaryController.java
+++ b/src/main/java/com/ruoyi/purchase/controller/ProcurementBusinessSummaryController.java
@@ -6,7 +6,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.purchase.dto.ProcurementBusinessSummaryDto;
 import com.ruoyi.purchase.service.impl.ProcurementBusinessSummaryServiceImpl;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -31,8 +31,8 @@
     private ProcurementBusinessSummaryServiceImpl procurementBusinessSummaryService;
 
     @GetMapping("/listPage")
-    public AjaxResult listPage(Page page, ProcurementBusinessSummaryDto procurementBusinessSummaryDto) {
-        return AjaxResult.success(procurementBusinessSummaryService.listPage(page, procurementBusinessSummaryDto));
+    public R<?> listPage(Page page, ProcurementBusinessSummaryDto procurementBusinessSummaryDto) {
+        return R.ok(procurementBusinessSummaryService.listPage(page, procurementBusinessSummaryDto));
     }
 
     /**
diff --git a/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java b/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
index 3290499..ebbd718 100644
--- a/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
+++ b/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
@@ -8,7 +8,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.framework.web.page.TableDataInfo;
 import com.ruoyi.purchase.dto.PurchaseLedgerDto;
 import com.ruoyi.purchase.mapper.PurchaseLedgerTemplateMapper;
@@ -67,7 +67,7 @@
     @Log(title = "瀵煎叆閲囪喘鍙拌处", businessType = BusinessType.INSERT)
     @PostMapping("/import")
     @Operation(summary = "瀵煎叆閲囪喘鍙拌处")
-    public AjaxResult importData(@RequestParam("file")
+    public R<?> importData(@RequestParam("file")
                                  @ApiParam(value = "Excel鏂囦欢", required = true)
                                          MultipartFile file) {
         return purchaseLedgerService.importData(file);
@@ -151,8 +151,9 @@
      */
     @Log(title = "閲囪喘鍙拌处", businessType = BusinessType.INSERT)
     @PostMapping("/addOrEditPurchase")
-    public AjaxResult addOrEditPurchase(@RequestBody PurchaseLedgerDto purchaseLedgerDto) throws Exception {
-        return toAjax(purchaseLedgerService.addOrEditPurchase(purchaseLedgerDto));
+    public R<?> addOrEditPurchase(@RequestBody PurchaseLedgerDto purchaseLedgerDto) throws Exception {
+        purchaseLedgerService.addOrEditPurchase(purchaseLedgerDto);
+        return R.ok();
     }
 
     /**
@@ -160,7 +161,7 @@
      */
     @Operation(summary = "/鏌ヨ閲囪喘妯℃澘")
     @GetMapping("/getPurchaseTemplateList")
-    public AjaxResult getPurchaseTemplateList() {
+    public R<?> getPurchaseTemplateList() {
         List<PurchaseLedgerTemplate>  purchaseLedgers = purchaseLedgerTemplateMapper.selectList(null);
         purchaseLedgers.forEach(purchaseLedgerDto1 -> {
             LambdaQueryWrapper<SalesLedgerProductTemplate> queryWrapper = new LambdaQueryWrapper<>();
@@ -171,14 +172,15 @@
                 purchaseLedgerDto1.setProductList(list);
             }
         });
-        return AjaxResult.success(purchaseLedgers);
+        return R.ok(purchaseLedgers);
     }
     /**
      * 淇敼閲囪喘鍙拌处瀹℃壒鐘舵��
      */
     @PostMapping("/updateApprovalStatus")
-    public AjaxResult addOrEditPurchase(@RequestBody PurchaseLedger purchaseLedger){
-        return toAjax(purchaseLedgerService.updateById(purchaseLedger));
+    public R<?> addOrEditPurchase(@RequestBody PurchaseLedger purchaseLedger){
+        purchaseLedgerService.updateById(purchaseLedger);
+        return R.ok();
     }
     /**
      * 鏌ヨ閲囪喘鍙拌处鍜屼骇鍝佺埗瀛愬垪琛�
@@ -201,8 +203,9 @@
      */
     @Log(title = "閲囪喘鍙拌处", businessType = BusinessType.DELETE)
     @DeleteMapping("/delPurchase")
-    public AjaxResult remove(@RequestBody Long[] ids) {
-        return toAjax(purchaseLedgerService.deletePurchaseLedgerByIds(ids));
+    public R<?> remove(@RequestBody Long[] ids) {
+        purchaseLedgerService.deletePurchaseLedgerByIds(ids);
+        return R.ok();
     }
 
     /**
@@ -218,8 +221,8 @@
      * 鏍规嵁閿�鍞悎鍚屾煡璇骇鍝佷俊鎭�
      */
     @GetMapping("/getProductBySalesNo")
-    public AjaxResult getProductBySalesNo(Long id) {
-        return AjaxResult.success(purchaseLedgerService.getProductBySalesNo(id));
+    public R<?> getProductBySalesNo(Long id) {
+        return R.ok(purchaseLedgerService.getProductBySalesNo(id));
     }
 
     /**
@@ -234,8 +237,8 @@
      * 鏍规嵁id鏌ヨ閲囪喘鍚堝悓鍙�
      */
     @GetMapping("/getPurchaseNoById")
-    public AjaxResult getPurchaseNoById(Long id) {
-        return AjaxResult.success(purchaseLedgerService.getPurchaseNoById(id));
+    public R<?> getPurchaseNoById(Long id) {
+        return R.ok(purchaseLedgerService.getPurchaseNoById(id));
     }
 
     /**
@@ -250,22 +253,22 @@
      * 鏍规嵁閲囪喘鍚堝悓鍙锋煡璇骇鍝�
      */
     @GetMapping("/getInfo")
-    public AjaxResult getInfo(PurchaseLedgerDto purchaseLedgerDto) {
-        return AjaxResult.success(purchaseLedgerService.getInfo(purchaseLedgerDto));
+    public R<?> getInfo(PurchaseLedgerDto purchaseLedgerDto) {
+        return R.ok(purchaseLedgerService.getInfo(purchaseLedgerDto));
     }
 
     /**
      * 鏌ヨ閲囪喘鍙拌处鍒楄〃
      */
     @GetMapping("/listPage")
-    public AjaxResult listPage(Page page, PurchaseLedgerDto purchaseLedger) {
-        return AjaxResult.success(purchaseLedgerService.selectPurchaseLedgerListPage(page, purchaseLedger));
+    public R<?> listPage(Page page, PurchaseLedgerDto purchaseLedger) {
+        return R.ok(purchaseLedgerService.selectPurchaseLedgerListPage(page, purchaseLedger));
     }
 
     @Operation(summary = "鐢熸垚閲囪喘搴忓垪鍙�")
     @GetMapping("/createPurchaseNo")
     @Log(title = "鐢熸垚閲囪喘搴忓垪鍙�", businessType = BusinessType.OTHER)
-    public AjaxResult createPurchaseNo() {
-        return AjaxResult.success("鐢熸垚鎴愬姛",purchaseLedgerService.getPurchaseNo());
+    public R<?> createPurchaseNo() {
+        return R.ok(purchaseLedgerService.getPurchaseNo(), "鐢熸垚鎴愬姛");
     }
 }
diff --git a/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerTemplateController.java b/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerTemplateController.java
index 3b3c97f..996970d 100644
--- a/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerTemplateController.java
+++ b/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerTemplateController.java
@@ -4,7 +4,8 @@
 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.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.purchase.dto.PurchaseLedgerDto;
 import com.ruoyi.purchase.mapper.PurchaseLedgerTemplateMapper;
 import com.ruoyi.purchase.mapper.SalesLedgerProductTemplateMapper;
@@ -31,7 +32,7 @@
 @RequestMapping("/purchaseLedgerTemplate")
 @Tag(name = "閲囪喘鍙拌处妯℃澘")
 @AllArgsConstructor
-public class PurchaseLedgerTemplateController {
+public class PurchaseLedgerTemplateController extends BaseController {
 
     private PurchaseLedgerTemplateMapper purchaseLedgerTemplateMapper;
     private SalesLedgerProductTemplateMapper salesLedgerProductTemplateMapper;
@@ -39,7 +40,7 @@
     @PostMapping("/add")
     @Log(title = "娣诲姞閲囪喘鍙拌处妯℃澘", businessType = BusinessType.INSERT)
     @Operation(summary = "娣诲姞閲囪喘鍙拌处妯℃澘")
-    public AjaxResult add(@RequestBody PurchaseLedgerDto purchaseLedgerDto) {
+    public R<?> add(@RequestBody PurchaseLedgerDto purchaseLedgerDto) {
         // 閲囪喘妯℃澘
         if(StringUtils.isNotEmpty(purchaseLedgerDto.getTemplateName())){
             // 妯℃澘鍚嶇О涓嶈兘閲嶅锛屾湁閲嶅灏变笉闇�瑕佹柊澧炰簡
@@ -63,24 +64,24 @@
                 });
             }
         }
-        return AjaxResult.success();
+        return R.ok();
     }
 
     @DeleteMapping("/delete")
     @Log(title = "閲囪喘鍙拌处妯℃澘", businessType = BusinessType.DELETE)
     @Operation(summary = "鍒犻櫎閲囪喘鍙拌处妯℃澘")
-    public AjaxResult delete(@RequestBody List<Long> id) {
-        if(CollectionUtils.isEmpty(id)) return AjaxResult.error("璇烽�夋嫨瑕佸垹闄ょ殑閲囪喘鍙拌处妯℃澘");
+    public R<?> delete(@RequestBody List<Long> id) {
+        if(CollectionUtils.isEmpty(id)) return R.fail("璇烽�夋嫨瑕佸垹闄ょ殑閲囪喘鍙拌处妯℃澘");
         int result = purchaseLedgerTemplateMapper.deleteBatchIds(id);
         salesLedgerProductTemplateMapper.delete(new LambdaQueryWrapper<SalesLedgerProductTemplate>()
                 .in(SalesLedgerProductTemplate::getSalesLedgerId, id));
-        return AjaxResult.success(result);
+        return R.ok(result);
     }
 
     @PostMapping("/update")
     @Log(title = "淇敼閲囪喘鍙拌处妯℃澘", businessType = BusinessType.UPDATE)
     @Operation(summary = "淇敼閲囪喘鍙拌处妯℃澘")
-    public AjaxResult update(@RequestBody PurchaseLedgerDto purchaseLedgerDto) {
+    public R<?> update(@RequestBody PurchaseLedgerDto purchaseLedgerDto) {
         // 妯℃澘鍚嶇О涓嶈兘閲嶅锛屾湁閲嶅灏变笉闇�瑕佹柊澧炰簡
         PurchaseLedgerTemplate purchaseLedgerTemplate = purchaseLedgerTemplateMapper
                 .selectOne(new LambdaQueryWrapper<PurchaseLedgerTemplate>()
@@ -102,7 +103,7 @@
                 salesLedgerProductTemplateMapper.insert(salesLedgerProductTemplate);
             });
         }
-        return AjaxResult.success();
+        return R.ok();
     }
 
 }
diff --git a/src/main/java/com/ruoyi/purchase/controller/PurchaseReturnOrdersController.java b/src/main/java/com/ruoyi/purchase/controller/PurchaseReturnOrdersController.java
index bb669b6..f1fb4e8 100644
--- a/src/main/java/com/ruoyi/purchase/controller/PurchaseReturnOrdersController.java
+++ b/src/main/java/com/ruoyi/purchase/controller/PurchaseReturnOrdersController.java
@@ -4,7 +4,8 @@
 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 com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.purchase.dto.PurchaseReturnOrderDto;
 import com.ruoyi.purchase.mapper.PurchaseReturnOrdersMapper;
 import com.ruoyi.purchase.service.PurchaseReturnOrdersService;
@@ -28,43 +29,43 @@
 @RequestMapping("/purchaseReturnOrders")
 @Tag(name = "閲囪喘閫�璐у崟")
 @AllArgsConstructor
-public class PurchaseReturnOrdersController {
+public class PurchaseReturnOrdersController extends BaseController {
     private PurchaseReturnOrdersService purchaseReturnOrdersService;
     private PurchaseReturnOrdersMapper purchaseReturnOrdersMapper;
 
 
     @GetMapping("/listPage")
-    public AjaxResult listPage(Page page, PurchaseReturnOrderDto purchaseReturnOrderDto) {
-        return AjaxResult.success(purchaseReturnOrdersService.listPage(page, purchaseReturnOrderDto));
+    public R<?> listPage(Page page, PurchaseReturnOrderDto purchaseReturnOrderDto) {
+        return R.ok(purchaseReturnOrdersService.listPage(page, purchaseReturnOrderDto));
     }
 
     // 鏂板
     @Log(title = "閲囪喘閫�璐у崟", businessType = BusinessType.INSERT)
     @PostMapping("/add")
-    public AjaxResult add(@RequestBody PurchaseReturnOrderDto purchaseReturnOrderDto) throws Exception {
+    public R<?> add(@RequestBody PurchaseReturnOrderDto purchaseReturnOrderDto) throws Exception {
         if (purchaseReturnOrderDto.getIsDefaultNo()) {
             purchaseReturnOrderDto.setNo(OrderUtils.countTodayByCreateTime(purchaseReturnOrdersMapper, "CGTL", "no"));
         }
-        return AjaxResult.success(purchaseReturnOrdersService.add(purchaseReturnOrderDto));
+        return R.ok(purchaseReturnOrdersService.add(purchaseReturnOrderDto));
     }
 
 
     @GetMapping("/selectById/{id}")
-    public AjaxResult selectById(@PathVariable Long id) {
-        return AjaxResult.success(purchaseReturnOrdersService.getPurchaseReturnOrderDtoById(id));
+    public R<?> selectById(@PathVariable Long id) {
+        return R.ok(purchaseReturnOrdersService.getPurchaseReturnOrderDtoById(id));
     }
 
     @PostMapping("/deleteById/{id}")
-    public AjaxResult deleteById(@PathVariable Long id) {
+    public R<?> deleteById(@PathVariable Long id) {
         purchaseReturnOrdersService.deleteById(id);
-        return AjaxResult.success();
+        return R.ok();
     }
 
     @GetMapping("/getByPurchaseLedgerId")
     @Operation(summary = "閲囪喘閫�璐�-鏍规嵁閲囪喘璁㈠崟id鏌ヨ閲囪喘璁㈠崟瀵瑰簲鐨勫叆搴撲骇鍝佷俊鎭�")
-    public AjaxResult getByPurchaseLedgerId(Long purchaseLedgerId) {
+    public R<?> getByPurchaseLedgerId(Long purchaseLedgerId) {
         List<PurchaseStockInProductVo> purchaseStockInProductVos = purchaseReturnOrdersService.getByPurchaseLedgerId(purchaseLedgerId);
-        return AjaxResult.success(purchaseStockInProductVos);
+        return R.ok(purchaseStockInProductVos);
     }
 
 
diff --git a/src/main/java/com/ruoyi/purchase/controller/TicketRegistrationController.java b/src/main/java/com/ruoyi/purchase/controller/TicketRegistrationController.java
index db628af..ceeba52 100644
--- a/src/main/java/com/ruoyi/purchase/controller/TicketRegistrationController.java
+++ b/src/main/java/com/ruoyi/purchase/controller/TicketRegistrationController.java
@@ -6,7 +6,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.framework.web.page.TableDataInfo;
 import com.ruoyi.purchase.dto.PaymentRegistrationDto;
 import com.ruoyi.purchase.dto.ProductRecordDto;
@@ -70,23 +70,24 @@
 
     @Operation(summary = "鏍规嵁id鏌ヨ浠樻娴佹按")
     @GetMapping("/getPaymentRegistrationById")
-    public AjaxResult getPaymentRegistrationById(Long id) {
+    public R<?> getPaymentRegistrationById(Long id) {
         PaymentRegistration byId = paymentRegistrationService.getById(id);
-        return AjaxResult.success(byId);
+        return R.ok(byId);
     }
 
     @Operation(summary = "淇敼浠樻娴佹按")
     @PutMapping("/updatePaymentRegistration")
     @Log(title = "淇敼浠樻娴佹按", businessType = BusinessType.UPDATE)
-    public AjaxResult updatePaymentRegistration(@RequestBody PaymentRegistration paymentRegistratio) {
-        return AjaxResult.success(paymentRegistrationService.updatePaymentRegistration(paymentRegistratio));
+    public R<?> updatePaymentRegistration(@RequestBody PaymentRegistration paymentRegistratio) {
+        return R.ok(paymentRegistrationService.updatePaymentRegistration(paymentRegistratio));
     }
 
     @Operation(summary = "鍒犻櫎浠樻娴佹按")
     @DeleteMapping("/delPaymentRegistration")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult delPaymentRegistration(@RequestBody List<Long> id) {
-        return toAjax(paymentRegistrationService.delPaymentRegistration(id));
+    public R<?> delPaymentRegistration(@RequestBody List<Long> id) {
+        paymentRegistrationService.delPaymentRegistration(id);
+        return R.ok();
     }
 
     /**
@@ -126,26 +127,26 @@
     @Log(title = "鏉ョエ鐧昏", businessType = BusinessType.INSERT)
     @PostMapping("/addOrUpdateRegistration")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult addOrUpdateRegistration(@RequestBody List<TicketRegistrationDto> ticketRegistrationDto) throws IOException {
-        if(CollectionUtils.isEmpty(ticketRegistrationDto)) return AjaxResult.error("璇烽�夋嫨瑕佷繚瀛樼殑璁板綍");
+    public R<?> addOrUpdateRegistration(@RequestBody List<TicketRegistrationDto> ticketRegistrationDto) throws IOException {
+        if(CollectionUtils.isEmpty(ticketRegistrationDto)) return R.fail("璇烽�夋嫨瑕佷繚瀛樼殑璁板綍");
         for (TicketRegistrationDto ticketRegistrationDto1 : ticketRegistrationDto) {
             ticketRegistrationService.addOrUpdateRegistration(ticketRegistrationDto1);
         }
-        return toAjax(1);
+        return R.ok();
     }
 
 
     @PostMapping("/getProductRecordById")
-    public AjaxResult getProductRecordById(@RequestBody ProductRecordDto productRecordDto) {
+    public R<?> getProductRecordById(@RequestBody ProductRecordDto productRecordDto) {
         if (productRecordDto.getId() == null) {
-            return AjaxResult.error("鍙傛暟閿欒");
+            return R.fail("鍙傛暟閿欒");
         }
-        return AjaxResult.success(productRecordService.getProductRecordById(productRecordDto));
+        return R.ok(productRecordService.getProductRecordById(productRecordDto));
     }
 
     @Schema(description = "淇敼鏉ョエ鐧昏")
     @PostMapping("/updateRegistration")
-    public AjaxResult updateRegistration(@RequestBody ProductRecordDto productRecordDto) {
+    public R<?> updateRegistration(@RequestBody ProductRecordDto productRecordDto) {
 
         return productRecordService.updateRecord(productRecordDto);
     }
@@ -156,8 +157,9 @@
     @Log(title = "鍒犻櫎鏉ョエ鐧昏(鏉ョエ鍙拌处)", businessType = BusinessType.DELETE)
     @DeleteMapping("/delRegistration")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult delRegistration(@RequestBody Long[] ids) {
-        return toAjax(ticketRegistrationService.delRegistration(ids));
+    public R<?> delRegistration(@RequestBody Long[] ids) {
+        ticketRegistrationService.delRegistration(ids);
+        return R.ok();
     }
 
     /**
@@ -173,18 +175,18 @@
      * 鍒嗛〉鏌ヨ浜у搧淇℃伅寮�绁ㄨ褰曞垪琛�
      */
     @GetMapping("/productRecordPage")
-    public AjaxResult productRecordPage(Page page, TicketRegistrationDto ticketRegistrationDto) {
+    public R<?> productRecordPage(Page page, TicketRegistrationDto ticketRegistrationDto) {
 
         IPage<ProductRecordDto> list = productRecordService.productRecordPage(page,ticketRegistrationDto);
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
 
     /**
      * 鏌ヨ鍙戠エ鍙�
      */
     @GetMapping("/getTicketNo")
-    public AjaxResult getTicketNo(TicketRegistrationDto ticketRegistrationDto) {
-        return AjaxResult.success(ticketRegistrationService.getTicketNo(ticketRegistrationDto));
+    public R<?> getTicketNo(TicketRegistrationDto ticketRegistrationDto) {
+        return R.ok(ticketRegistrationService.getTicketNo(ticketRegistrationDto));
     }
 
     /**
@@ -197,8 +199,8 @@
 
     @Schema(description = "鏍规嵁id鏌ヨ鏉ユ紓鐧昏")
     @GetMapping("/getPuargeById")
-    public AjaxResult getPuargeById(Long id) {
-        return AjaxResult.success(ticketRegistrationService.getPuargeById( id));
+    public R<?> getPuargeById(Long id) {
+        return R.ok(ticketRegistrationService.getPuargeById( id));
     }
 
 
diff --git a/src/main/java/com/ruoyi/purchase/mapper/PurchaseReturnOrdersMapper.java b/src/main/java/com/ruoyi/purchase/mapper/PurchaseReturnOrdersMapper.java
index 9d28354..4eb517f 100644
--- a/src/main/java/com/ruoyi/purchase/mapper/PurchaseReturnOrdersMapper.java
+++ b/src/main/java/com/ruoyi/purchase/mapper/PurchaseReturnOrdersMapper.java
@@ -3,8 +3,8 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.account.bean.dto.PurchaseReturnDto;
-import com.ruoyi.account.bean.vo.PurchaseReturnVo;
+import com.ruoyi.account.bean.dto.purchase.PurchaseReturnDto;
+import com.ruoyi.account.bean.vo.purchase.PurchaseReturnVo;
 import com.ruoyi.purchase.dto.PurchaseReturnOrderDto;
 import com.ruoyi.purchase.dto.PurchaseReturnOrderHasAllInfoDto;
 import com.ruoyi.purchase.pojo.PurchaseReturnOrders;
diff --git a/src/main/java/com/ruoyi/purchase/service/IProductRecordService.java b/src/main/java/com/ruoyi/purchase/service/IProductRecordService.java
index 3ab3d32..6048e5c 100644
--- a/src/main/java/com/ruoyi/purchase/service/IProductRecordService.java
+++ b/src/main/java/com/ruoyi/purchase/service/IProductRecordService.java
@@ -3,7 +3,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.purchase.dto.ProductRecordDto;
 import com.ruoyi.purchase.dto.TicketRegistrationDto;
 import com.ruoyi.purchase.pojo.ProductRecord;
@@ -22,7 +22,7 @@
 
     IPage<ProductRecordDto> productRecordPage(Page page, TicketRegistrationDto ticketRegistrationDto);
 
-    AjaxResult updateRecord(ProductRecordDto productRecordDto);
+    R<?> updateRecord(ProductRecordDto productRecordDto);
 
     ProductRecordDto getProductRecordById(ProductRecordDto productRecordDto);
 }
diff --git a/src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java b/src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java
index d09050e..be515e6 100644
--- a/src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java
+++ b/src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java
@@ -3,7 +3,7 @@
 
 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.InvoiceRegistrationProduct;
@@ -44,7 +44,7 @@
 
     String getPurchaseNo();
 
-    AjaxResult importData(MultipartFile file);
+    R<?> importData(MultipartFile file);
 
     PurchaseLedgerDto getPurchaseByCode(PurchaseLedgerDto purchaseLedgerDto);
 }
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/ProductRecordServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/ProductRecordServiceImpl.java
index 961e759..1cee7de 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/ProductRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/ProductRecordServiceImpl.java
@@ -6,7 +6,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.enums.FileNameType;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.purchase.dto.ProductRecordDto;
 import com.ruoyi.purchase.dto.TicketRegistrationDto;
 import com.ruoyi.purchase.mapper.ProductRecordMapper;
@@ -67,9 +67,9 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult updateRecord(ProductRecordDto productRecordDto) {
+    public R<?> updateRecord(ProductRecordDto productRecordDto) {
         ProductRecord productRecord = productRecordMapper.selectById(productRecordDto.getId());
-        if (productRecord == null) return AjaxResult.error("璁板綍涓嶅瓨鍦�");
+        if (productRecord == null) return R.fail("璁板綍涓嶅瓨鍦�");
 
         //  鏇存柊浜у搧鍙拌处
         SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(productRecord.getSaleLedgerProjectId());
@@ -110,7 +110,7 @@
         productRecord.setFutureTicketsAmount(productRecord.getFutureTickets().multiply(productRecord.getTaxInclusiveUnitPrice()));
         productRecordMapper.updateById(productRecord);
 
-        return AjaxResult.success("淇敼鎴愬姛");
+        return R.ok(null, "淇敼鎴愬姛");
     }
 
     @Override
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 cdf80f9..e7cff23 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -24,7 +24,7 @@
 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;
@@ -534,18 +534,18 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult importData(MultipartFile file) {
+    public R<?> importData(MultipartFile file) {
         LoginUser loginUser = SecurityUtils.getLoginUser();
         try {
             InputStream inputStream = file.getInputStream();
             ExcelUtil<PurchaseLedgerImportDto> salesLedgerImportDtoExcelUtil = new ExcelUtil<>(PurchaseLedgerImportDto.class);
             Map<String, List<PurchaseLedgerImportDto>> stringListMap = salesLedgerImportDtoExcelUtil.importExcelMultiSheet(Arrays.asList("閲囪喘鍙拌处鏁版嵁", "閲囪喘浜у搧鏁版嵁"), inputStream, 0);
-            if (CollectionUtils.isEmpty(stringListMap)) return AjaxResult.error("閲囪喘琛ㄦ牸涓虹┖锛�");
+            if (CollectionUtils.isEmpty(stringListMap)) return R.fail("閲囪喘琛ㄦ牸涓虹┖锛�");
             // 涓氬姟灞傚悎骞�
             List<PurchaseLedgerImportDto> salesLedgerImportDtoList = stringListMap.get("閲囪喘鍙拌处鏁版嵁");
-            if (CollectionUtils.isEmpty(salesLedgerImportDtoList)) return AjaxResult.error("閲囪喘鍙拌处鏁版嵁涓虹┖锛�");
+            if (CollectionUtils.isEmpty(salesLedgerImportDtoList)) return R.fail("閲囪喘鍙拌处鏁版嵁涓虹┖锛�");
             List<PurchaseLedgerImportDto> salesLedgerProductImportDtoList = stringListMap.get("閲囪喘浜у搧鏁版嵁");
-            if (CollectionUtils.isEmpty(salesLedgerProductImportDtoList)) return AjaxResult.error("閲囪喘浜у搧鏁版嵁涓虹┖锛�");
+            if (CollectionUtils.isEmpty(salesLedgerProductImportDtoList)) return R.fail("閲囪喘浜у搧鏁版嵁涓虹┖锛�");
             // 渚涘簲鍟嗘暟鎹�
             List<SupplierManage> customers = supplierManageMapper.selectList(new LambdaQueryWrapper<SupplierManage>().in(SupplierManage::getSupplierName,
                     salesLedgerImportDtoList.stream().map(PurchaseLedgerImportDto::getSupplierName).collect(Collectors.toList())));
@@ -640,11 +640,11 @@
                 addApproveByPurchase(loginUser,salesLedger);
             }
 
-            return AjaxResult.success("瀵煎叆鎴愬姛");
+            return R.ok(null, "瀵煎叆鎴愬姛");
         } catch (Exception e) {
             e.printStackTrace();
         }
-        return AjaxResult.success("瀵煎叆澶辫触");
+        return R.ok(null, "瀵煎叆澶辫触");
     }
 
     @Override
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 24e3405..9da4a11 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseReturnOrdersServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseReturnOrdersServiceImpl.java
@@ -29,13 +29,11 @@
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.service.ISalesLedgerService;
 import com.ruoyi.stock.mapper.StockOutRecordMapper;
-import com.ruoyi.stock.pojo.StockOutRecord;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -122,9 +120,9 @@
         updateWrapper.eq(PurchaseReturnOrderProducts::getPurchaseReturnOrderId, id);
         purchaseReturnOrderProductsMapper.delete(updateWrapper);
         //(閲囪喘閫�璐х殑鏁版嵁闇�瑕佸垹鎺�)
-        stockOutRecordMapper.delete(Wrappers.<StockOutRecord>lambdaQuery()
-                .eq(StockOutRecord::getRecordType,StockOutQualifiedRecordTypeEnum.PURCHASE_RETURN_STOCK_OUT.getCode())
-                .in(StockOutRecord::getRecordId, purchaseReturnOrderProducts.stream().map(PurchaseReturnOrderProducts::getId).collect(Collectors.toList())));
+        purchaseReturnOrderProducts.stream().forEach(purchaseReturnOrderProducts1 -> {
+            stockUtils.deleteStockOutRecord(purchaseReturnOrderProducts1.getId(),StockOutQualifiedRecordTypeEnum.PURCHASE_RETURN_STOCK_OUT.getCode());
+        });
         // 璐㈠姟
         LambdaUpdateWrapper<AccountIncome> updateWrapperAccountIncome = new LambdaUpdateWrapper<>();
         updateWrapperAccountIncome.eq(AccountIncome::getBusinessId, id);
diff --git a/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java b/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
index fcaceb6..cc295d5 100644
--- a/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
+++ b/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
@@ -2,7 +2,9 @@
 
 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.framework.web.domain.R;
 import com.ruoyi.quality.dto.QualityInspectDto;
 import com.ruoyi.quality.pojo.QualityInspect;
 import com.ruoyi.quality.pojo.QualityInspectFile;
@@ -10,6 +12,7 @@
 import com.ruoyi.quality.service.IQualityInspectFileService;
 import com.ruoyi.quality.service.IQualityInspectParamService;
 import com.ruoyi.quality.service.IQualityInspectService;
+import io.swagger.v3.oas.annotations.Operation;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.AllArgsConstructor;
 import org.springframework.util.CollectionUtils;
@@ -37,8 +40,10 @@
      * @return
      */
     @PostMapping("/add")
-    public AjaxResult add(@RequestBody QualityInspectDto qualityInspectDto) {
-        return AjaxResult.success(qualityInspectService.add(qualityInspectDto));
+    @Operation(summary = "鏂板妫�楠�")
+    @Log(title = "鏂板妫�楠�", businessType = BusinessType.INSERT)
+    public R<?> add(@RequestBody QualityInspectDto qualityInspectDto) {
+        return R.ok(qualityInspectService.add(qualityInspectDto));
     }
 
     /**
@@ -48,9 +53,11 @@
      * @return
      */
     @DeleteMapping("/del")
-    public AjaxResult delQualityInspect(@RequestBody List<Integer> ids) {
+    @Operation(summary = "鍒犻櫎妫�楠�")
+    @Log(title = "鍒犻櫎妫�楠�", businessType = BusinessType.DELETE)
+    public R<?> delQualityInspect(@RequestBody List<Integer> ids) {
         if (CollectionUtils.isEmpty(ids)) {
-            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+            return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         }
         //濡傛灉宸茬粡鎻愪氦灏变笉鍏佽鍒犻櫎
         List<QualityInspect> qualityInspects = qualityInspectService.listByIds(ids);
@@ -66,7 +73,7 @@
         qualityInspectFileService.remove(Wrappers.<QualityInspectFile>lambdaQuery()
                 .in(QualityInspectFile::getInspectId, ids));
         //鍒犻櫎妫�楠屽崟
-        return AjaxResult.success(qualityInspectService.removeBatchByIds(ids));
+        return R.ok(qualityInspectService.removeBatchByIds(ids));
     }
 
     /**
@@ -76,8 +83,10 @@
      * @return
      */
     @GetMapping("/{id}")
-    public AjaxResult QualityInspectDetail(@PathVariable("id") Integer id) {
-        return AjaxResult.success(qualityInspectService.getDetailById(id));
+    @Operation(summary = "妫�楠岃鎯�")
+    @Log(title = "妫�楠岃鎯�", businessType = BusinessType.OTHER)
+    public R<?> QualityInspectDetail(@PathVariable("id") Integer id) {
+        return R.ok(qualityInspectService.getDetailById(id));
     }
 
     /**
@@ -87,8 +96,10 @@
      * @return
      */
     @PostMapping("/update")
-    public AjaxResult update(@RequestBody QualityInspectDto qualityInspectDto) {
-        return AjaxResult.success(qualityInspectService.updateQualityInspect(qualityInspectDto));
+    @Operation(summary = "淇敼妫�楠�")
+    @Log(title = "淇敼妫�楠�", businessType = BusinessType.UPDATE)
+    public R<?> update(@RequestBody QualityInspectDto qualityInspectDto) {
+        return R.ok(qualityInspectService.updateQualityInspect(qualityInspectDto));
     }
 
     /**
@@ -99,8 +110,10 @@
      * @return
      */
     @GetMapping("/listPage")
-    public AjaxResult qualityInspectListPage(Page page, QualityInspectDto qualityInspect) {
-        return AjaxResult.success(qualityInspectService.qualityInspectListPage(page, qualityInspect));
+    @Operation(summary = "鍒嗛〉鏌ヨ妫�楠�")
+    @Log(title = "鍒嗛〉鏌ヨ妫�楠�", businessType = BusinessType.OTHER)
+    public R<?> qualityInspectListPage(Page page, QualityInspectDto qualityInspect) {
+        return R.ok(qualityInspectService.qualityInspectListPage(page, qualityInspect));
     }
 
     /**
@@ -110,6 +123,8 @@
      * @param qualityInspect
      */
     @PostMapping("/export")
+    @Operation(summary = "瀵煎嚭妫�楠�")
+    @Log(title = "瀵煎嚭妫�楠�", businessType = BusinessType.EXPORT)
     public void qualityInspectExport(HttpServletResponse response, QualityInspect qualityInspect) {
         qualityInspectService.qualityInspectExport(response, qualityInspect);
     }
@@ -121,8 +136,10 @@
      * @return
      */
     @PostMapping("/submit")
-    public AjaxResult submit(@RequestBody QualityInspect qualityInspect) {
-        return AjaxResult.success(qualityInspectService.submit(qualityInspect));
+    @Operation(summary = "鎻愪氦妫�楠�")
+    @Log(title = "鎻愪氦妫�楠�", businessType = BusinessType.OTHER)
+    public R<?> submit(@RequestBody QualityInspect qualityInspect) {
+        return R.ok(qualityInspectService.submit(qualityInspect));
     }
 
     /**
@@ -132,6 +149,8 @@
      * @param qualityInspect
      */
     @PostMapping("/down")
+    @Operation(summary = "涓嬭浇妫�楠�")
+    @Log(title = "涓嬭浇妫�楠�", businessType = BusinessType.OTHER)
     public void down(HttpServletResponse response, @RequestBody QualityInspect qualityInspect) {
         qualityInspectService.down(response, qualityInspect);
     }
diff --git a/src/main/java/com/ruoyi/quality/controller/QualityInspectFileController.java b/src/main/java/com/ruoyi/quality/controller/QualityInspectFileController.java
index bc5df62..f32d87b 100644
--- a/src/main/java/com/ruoyi/quality/controller/QualityInspectFileController.java
+++ b/src/main/java/com/ruoyi/quality/controller/QualityInspectFileController.java
@@ -2,7 +2,7 @@
 
 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.web.domain.R;
 import com.ruoyi.quality.pojo.QualityInspect;
 import com.ruoyi.quality.pojo.QualityInspectFile;
 import com.ruoyi.quality.pojo.QualityInspectParam;
@@ -34,8 +34,8 @@
      * @return
      */
     @PostMapping("/add")
-    public AjaxResult add(@RequestBody QualityInspectFile qualityInspectFile) {
-        return AjaxResult.success(qualityInspectFileService.save(qualityInspectFile));
+    public R<?> add(@RequestBody QualityInspectFile qualityInspectFile) {
+        return R.ok(qualityInspectFileService.save(qualityInspectFile));
     }
 
     /**
@@ -44,12 +44,12 @@
      * @return
      */
     @DeleteMapping("/del")
-    public AjaxResult delQualityUnqualified(@RequestBody List<Integer> ids) {
+    public R<?> delQualityUnqualified(@RequestBody List<Integer> ids) {
         if(CollectionUtils.isEmpty(ids)){
-            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+            return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         }
         //鍒犻櫎妫�楠岄檮浠�
-        return AjaxResult.success(qualityInspectFileService.removeBatchByIds(ids));
+        return R.ok(qualityInspectFileService.removeBatchByIds(ids));
     }
 
     /**
@@ -59,8 +59,8 @@
      * @return
      */
     @GetMapping("/listPage")
-    public AjaxResult qualityInspectFileListPage(Page page, QualityInspectFile qualityInspectFile) {
-        return AjaxResult.success(qualityInspectFileService.qualityInspectFileListPage(page, qualityInspectFile));
+    public R<?> qualityInspectFileListPage(Page page, QualityInspectFile qualityInspectFile) {
+        return R.ok(qualityInspectFileService.qualityInspectFileListPage(page, qualityInspectFile));
     }
 
 
diff --git a/src/main/java/com/ruoyi/quality/controller/QualityInspectParamController.java b/src/main/java/com/ruoyi/quality/controller/QualityInspectParamController.java
index 263b201..48fc093 100644
--- a/src/main/java/com/ruoyi/quality/controller/QualityInspectParamController.java
+++ b/src/main/java/com/ruoyi/quality/controller/QualityInspectParamController.java
@@ -2,13 +2,16 @@
 
 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.framework.web.domain.R;
 import com.ruoyi.quality.pojo.QualityInspect;
 import com.ruoyi.quality.pojo.QualityInspectFile;
 import com.ruoyi.quality.pojo.QualityInspectParam;
 import com.ruoyi.quality.service.IQualityInspectFileService;
 import com.ruoyi.quality.service.IQualityInspectParamService;
 import com.ruoyi.quality.service.IQualityInspectService;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
@@ -32,8 +35,10 @@
      * @return
      */
     @GetMapping("/{inspectId}")
-    public AjaxResult QualityInspectParamDetail(@PathVariable("inspectId") Integer inspectId) {
-        return AjaxResult.success(qualityInspectParamService.qualityInspectParamDetail(inspectId));
+    @Operation(summary = "妫�楠屽弬鏁伴」璇︽儏")
+    @Log(title = "妫�楠屽弬鏁伴」璇︽儏", businessType = BusinessType.OTHER)
+    public R<?> QualityInspectParamDetail(@PathVariable("inspectId") Integer inspectId) {
+        return R.ok(qualityInspectParamService.qualityInspectParamDetail(inspectId));
     }
 
 
@@ -43,8 +48,10 @@
      * @return
      */
     @PostMapping("/update")
-    public AjaxResult update(@RequestBody List<QualityInspectParam> qualityInspectParams) {
-        return AjaxResult.success(qualityInspectParamService.updateBatchById(qualityInspectParams));
+    @Operation(summary = "淇敼妫�楠屽弬鏁伴」")
+    @Log(title = "淇敼妫�楠屽弬鏁伴」", businessType = BusinessType.UPDATE)
+    public R<?> update(@RequestBody List<QualityInspectParam> qualityInspectParams) {
+        return R.ok(qualityInspectParamService.updateBatchById(qualityInspectParams));
     }
 
     /**
@@ -53,11 +60,13 @@
      * @return
      */
     @DeleteMapping("/del")
-    public AjaxResult delQualityUnqualified(@RequestBody List<Integer> ids) {
+    @Operation(summary = "鍒犻櫎妫�楠屽弬鏁伴」")
+    @Log(title = "鍒犻櫎妫�楠屽弬鏁伴」", businessType = BusinessType.DELETE)
+    public R<?> delQualityUnqualified(@RequestBody List<Integer> ids) {
         if(CollectionUtils.isEmpty(ids)){
-            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+            return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         }
-        return AjaxResult.success(qualityInspectParamService.removeBatchByIds(ids));
+        return R.ok(qualityInspectParamService.removeBatchByIds(ids));
     }
 
 
diff --git a/src/main/java/com/ruoyi/quality/controller/QualityReportController.java b/src/main/java/com/ruoyi/quality/controller/QualityReportController.java
index 4d005b0..370e8f0 100644
--- a/src/main/java/com/ruoyi/quality/controller/QualityReportController.java
+++ b/src/main/java/com/ruoyi/quality/controller/QualityReportController.java
@@ -1,6 +1,8 @@
 package com.ruoyi.quality.controller;
 
-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.framework.web.domain.R;
 import com.ruoyi.quality.service.QualityReportService;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -30,8 +32,9 @@
      */
     @Operation(summary = "鑾峰彇妫�楠岀粺璁℃暟鎹�")
     @GetMapping("/getInspectStatistics")
-    public AjaxResult getInspectStatistics() {
-        return AjaxResult.success(qualityReportService.getInspectStatistics());
+    @Log(title = "鑾峰彇妫�楠岀粺璁℃暟鎹�", businessType = BusinessType.OTHER)
+    public R<?> getInspectStatistics() {
+        return R.ok(qualityReportService.getInspectStatistics());
     }
 
     /**
@@ -39,8 +42,9 @@
      */
     @Operation(summary = "鑾峰彇鍚堟牸鐜囩粺璁℃暟鎹�")
     @GetMapping("/getPassRateStatistics")
-    public AjaxResult getPassRateStatistics() {
-        return AjaxResult.success(qualityReportService.getPassRateStatistics());
+    @Log(title = "鑾峰彇鍚堟牸鐜囩粺璁℃暟鎹�", businessType = BusinessType.OTHER)
+    public R<?> getPassRateStatistics() {
+        return R.ok(qualityReportService.getPassRateStatistics());
     }
 
     /**
@@ -48,8 +52,9 @@
      */
     @Operation(summary = "鑾峰彇鏈堝害鍚堟牸鐜囩粺璁℃暟鎹�")
     @GetMapping("/getMonthlyPassRateStatistics")
-    public AjaxResult getMonthlyPassRateStatistics(@RequestParam("year") String year) {
-        return AjaxResult.success(qualityReportService.getMonthlyPassRateStatistics(year));
+    @Log(title = "鑾峰彇鏈堝害鍚堟牸鐜囩粺璁℃暟鎹�", businessType = BusinessType.OTHER)
+    public R<?> getMonthlyPassRateStatistics(@RequestParam("year") String year) {
+        return R.ok(qualityReportService.getMonthlyPassRateStatistics(year));
     }
 
     /**
@@ -57,8 +62,9 @@
      */
     @Operation(summary = "鑾峰彇骞村害鎬诲悎鏍肩巼缁熻鏁版嵁")
     @GetMapping("/getYearlyPassRateStatistics")
-    public AjaxResult getYearlyPassRateStatistics(@RequestParam("year") String year) {
-        return AjaxResult.success(qualityReportService.getYearlyPassRateStatistics(year));
+    @Log(title = "鑾峰彇骞村害鎬诲悎鏍肩巼缁熻鏁版嵁", businessType = BusinessType.OTHER)
+    public R<?> getYearlyPassRateStatistics(@RequestParam("year") String year) {
+        return R.ok(qualityReportService.getYearlyPassRateStatistics(year));
     }
 
     /**
@@ -66,8 +72,9 @@
      */
     @Operation(summary = "鑾峰彇鏈堝害瀹屾垚鏄庣粏鏁版嵁")
     @GetMapping("/getMonthlyCompletionDetails")
-    public AjaxResult getMonthlyCompletionDetails(@RequestParam("year") String year) {
-        return AjaxResult.success(qualityReportService.getMonthlyCompletionDetails(year));
+    @Log(title = "鑾峰彇鏈堝害瀹屾垚鏄庣粏鏁版嵁", businessType = BusinessType.OTHER)
+    public R<?> getMonthlyCompletionDetails(@RequestParam("year") String year) {
+        return R.ok(qualityReportService.getMonthlyCompletionDetails(year));
     }
 
     /**
@@ -75,8 +82,9 @@
      */
     @Operation(summary = "鑾峰彇鐑偣妫�娴嬫寚鏍囩粺璁�")
     @GetMapping("/getTopParameters")
-    public AjaxResult getTopParameters(@RequestParam("modelType") Integer modelType) {
-        return AjaxResult.success(qualityReportService.getTopParameters(modelType));
+    @Log(title = "鑾峰彇鐑偣妫�娴嬫寚鏍囩粺璁�", businessType = BusinessType.OTHER)
+    public R<?> getTopParameters(@RequestParam("modelType") Integer modelType) {
+        return R.ok(qualityReportService.getTopParameters(modelType));
     }
 
 }
diff --git a/src/main/java/com/ruoyi/quality/controller/QualityTestStandardBindingController.java b/src/main/java/com/ruoyi/quality/controller/QualityTestStandardBindingController.java
index 539f3f7..7f2142e 100644
--- a/src/main/java/com/ruoyi/quality/controller/QualityTestStandardBindingController.java
+++ b/src/main/java/com/ruoyi/quality/controller/QualityTestStandardBindingController.java
@@ -1,8 +1,12 @@
 package com.ruoyi.quality.controller;
 
-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.framework.web.domain.R;
 import com.ruoyi.quality.pojo.QualityTestStandardBinding;
 import com.ruoyi.quality.service.QualityTestStandardBindingService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.AllArgsConstructor;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
@@ -20,6 +24,7 @@
 @RestController
 @RequestMapping("/qualityTestStandardBinding")
 @AllArgsConstructor
+@Tag(name = "妫�娴嬫爣鍑嗕富琛ㄤ笌浜у搧鍏宠仈琛�")
 public class QualityTestStandardBindingController {
 
     private QualityTestStandardBindingService qualityTestStandardBindingService;
@@ -31,8 +36,10 @@
      * @return
      */
     @PostMapping("/add")
-    public AjaxResult add(@RequestBody List<QualityTestStandardBinding> qualityTestStandardBindings) {
-        return AjaxResult.success(qualityTestStandardBindingService.add(qualityTestStandardBindings));
+    @Operation(summary = "鏂板妫�娴嬫爣鍑嗕富琛ㄤ笌浜у搧鍏宠仈琛�")
+    @Log(title = "鏂板妫�娴嬫爣鍑嗕富琛ㄤ笌浜у搧鍏宠仈琛�", businessType = BusinessType.INSERT)
+    public R<?> add(@RequestBody List<QualityTestStandardBinding> qualityTestStandardBindings) {
+        return R.ok(qualityTestStandardBindingService.add(qualityTestStandardBindings));
     }
 
     /**
@@ -42,11 +49,13 @@
      * @return
      */
     @DeleteMapping("/del")
-    public AjaxResult delQualityTestStandard(@RequestBody List<Integer> ids) {
+    @Operation(summary = "鍒犻櫎妫�娴嬫爣鍑嗕富琛ㄤ笌浜у搧鍏宠仈琛�")
+    @Log(title = "鍒犻櫎妫�娴嬫爣鍑嗕富琛ㄤ笌浜у搧鍏宠仈琛�", businessType = BusinessType.DELETE)
+    public R<?> delQualityTestStandard(@RequestBody List<Integer> ids) {
         if (CollectionUtils.isEmpty(ids)) {
-            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+            return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         }
-        return AjaxResult.success(qualityTestStandardBindingService.removeBatchByIds(ids));
+        return R.ok(qualityTestStandardBindingService.removeBatchByIds(ids));
     }
 
     /**
@@ -55,8 +64,10 @@
      * @return
      */
     @GetMapping("/list")
-    public AjaxResult listBinding(Long testStandardId) {
-        return AjaxResult.success(qualityTestStandardBindingService.listBinding(testStandardId));
+    @Operation(summary = "妫�娴嬫寚鏍囩淮鎶ゆ煡璇�")
+    @Log(title = "妫�娴嬫寚鏍囩淮鎶ゆ煡璇�", businessType = BusinessType.OTHER)
+    public R<?> listBinding(Long testStandardId) {
+        return R.ok(qualityTestStandardBindingService.listBinding(testStandardId));
     }
 
 }
diff --git a/src/main/java/com/ruoyi/quality/controller/QualityTestStandardController.java b/src/main/java/com/ruoyi/quality/controller/QualityTestStandardController.java
index a61ffed..ab8fca9 100644
--- a/src/main/java/com/ruoyi/quality/controller/QualityTestStandardController.java
+++ b/src/main/java/com/ruoyi/quality/controller/QualityTestStandardController.java
@@ -2,11 +2,15 @@
 
 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.framework.web.domain.R;
 import com.ruoyi.quality.pojo.QualityTestStandard;
 import com.ruoyi.quality.pojo.QualityTestStandardParam;
 import com.ruoyi.quality.service.IQualityTestStandardService;
 import com.ruoyi.quality.service.QualityTestStandardParamService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
@@ -24,6 +28,7 @@
  */
 @RestController
 @RequestMapping("/qualityTestStandard")
+@Tag(name = "妫�娴嬫爣鍑嗕富琛�")
 public class QualityTestStandardController {
 
     @Resource
@@ -39,8 +44,10 @@
      * @return
      */
     @PostMapping("/add")
-    public AjaxResult add(@RequestBody QualityTestStandard qualityTestStandard) {
-        return AjaxResult.success(qualityTestStandardService.save(qualityTestStandard));
+    @Operation(summary = "鏂板妫�娴嬫爣鍑嗕富琛�")
+    @Log(title = "鏂板妫�娴嬫爣鍑嗕富琛�", businessType = BusinessType.INSERT)
+    public R<?> add(@RequestBody QualityTestStandard qualityTestStandard) {
+        return R.ok(qualityTestStandardService.save(qualityTestStandard));
     }
 
     /**
@@ -49,11 +56,13 @@
      * @return
      */
     @DeleteMapping("/del")
-    public AjaxResult delQualityTestStandard(@RequestBody List<Integer> ids) {
+    @Operation(summary = "鍒犻櫎妫�娴嬫爣鍑嗕富琛�")
+    @Log(title = "鍒犻櫎妫�娴嬫爣鍑嗕富琛�", businessType = BusinessType.DELETE)
+    public R<?> delQualityTestStandard(@RequestBody List<Integer> ids) {
         if(CollectionUtils.isEmpty(ids)){
-            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+            return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         }
-        return AjaxResult.success(qualityTestStandardService.delQualityTestStandard(ids));
+        return R.ok(qualityTestStandardService.delQualityTestStandard(ids));
     }
 
     /**
@@ -62,8 +71,10 @@
      * @return
      */
     @PostMapping("/update")
-    public AjaxResult update(@RequestBody QualityTestStandard qualityTestStandard) {
-        return AjaxResult.success(qualityTestStandardService.updateById(qualityTestStandard));
+    @Operation(summary = "妫�娴嬫爣鍑嗕富琛ㄤ慨鏀�")
+    @Log(title = "妫�娴嬫爣鍑嗕富琛ㄤ慨鏀�", businessType = BusinessType.UPDATE)
+    public R<?> update(@RequestBody QualityTestStandard qualityTestStandard) {
+        return R.ok(qualityTestStandardService.updateById(qualityTestStandard));
     }
 
     /**
@@ -73,8 +84,10 @@
      * @return
      */
     @GetMapping("/listPage")
-    public AjaxResult qualityTestStandardListPage(Page page, QualityTestStandard qualityTestStandard) {
-        return AjaxResult.success(qualityTestStandardService.qualityTestStandardListPage(page, qualityTestStandard));
+    @Operation(summary = "妫�娴嬫爣鍑嗕富琛ㄥ垎椤垫煡璇�")
+    @Log(title = "妫�娴嬫爣鍑嗕富琛ㄥ垎椤垫煡璇�", businessType = BusinessType.OTHER)
+    public R<?> qualityTestStandardListPage(Page page, QualityTestStandard qualityTestStandard) {
+        return R.ok(qualityTestStandardService.qualityTestStandardListPage(page, qualityTestStandard));
     }
 
     /**
@@ -83,8 +96,10 @@
      * @return
      */
     @PostMapping("/copyParam")
-    public AjaxResult copyParam(@RequestBody QualityTestStandard qualityTestStandard) {
-        return AjaxResult.success(qualityTestStandardService.copyParam(qualityTestStandard));
+    @Operation(summary = "妫�娴嬫爣鍑嗗鍒跺弬鏁�")
+    @Log(title = "妫�娴嬫爣鍑嗗鍒跺弬鏁�", businessType = BusinessType.OTHER)
+    public R<?> copyParam(@RequestBody QualityTestStandard qualityTestStandard) {
+        return R.ok(qualityTestStandardService.copyParam(qualityTestStandard));
     }
 
     /**
@@ -93,8 +108,10 @@
      * @return
      */
     @PostMapping("/qualityTestStandardAudit")
-    public AjaxResult qualityTestStandardAudit(@RequestBody List<QualityTestStandard> qualityTestStandards) {
-        return AjaxResult.success(qualityTestStandardService.updateBatchById(qualityTestStandards));
+    @Operation(summary = "妫�娴嬫爣鍑嗘壒閲忓鏍�")
+    @Log(title = "妫�娴嬫爣鍑嗘壒閲忓鏍�", businessType = BusinessType.OTHER)
+    public R<?> qualityTestStandardAudit(@RequestBody List<QualityTestStandard> qualityTestStandards) {
+        return R.ok(qualityTestStandardService.updateBatchById(qualityTestStandards));
     }
 
     /**
@@ -102,8 +119,10 @@
      * @return
      */
     @GetMapping("/getQualityTestStandardByProductId")
-    public AjaxResult getQualityTestStandardByProductId(@Nonnull Long productId, @Nonnull Integer inspectType, String process) {
-        return AjaxResult.success(qualityTestStandardService.getQualityTestStandardByProductId(productId,inspectType,process));
+    @Operation(summary = "鏍规嵁浜у搧id鏌ヨ鐩稿叧鐨勬楠屾爣鍑�")
+    @Log(title = "鏍规嵁浜у搧id鏌ヨ鐩稿叧鐨勬楠屾爣鍑�", businessType = BusinessType.OTHER)
+    public R<?> getQualityTestStandardByProductId(@Nonnull Long productId, @Nonnull Integer inspectType, String process) {
+        return R.ok(qualityTestStandardService.getQualityTestStandardByProductId(productId,inspectType,process));
     }
 
     /**
@@ -111,8 +130,10 @@
      * @return
      */
     @GetMapping("/getQualityTestStandardParamByTestStandardId")
-    public AjaxResult getQualityTestStandardParamByTestStandardId(Long testStandardId) {
-        return AjaxResult.success(qualityTestStandardParamService.list(Wrappers.<QualityTestStandardParam>lambdaQuery().eq(QualityTestStandardParam::getTestStandardId, testStandardId)));
+    @Operation(summary = "鏍规嵁妫�娴嬫爣鍑唅d鏌ヨ鐩稿叧鐨勬楠屾爣鍑嗗弬鏁�")
+    @Log(title = "鏍规嵁妫�娴嬫爣鍑唅d鏌ヨ鐩稿叧鐨勬楠屾爣鍑嗗弬鏁�", businessType = BusinessType.OTHER)
+    public R<?> getQualityTestStandardParamByTestStandardId(Long testStandardId) {
+        return R.ok(qualityTestStandardParamService.list(Wrappers.<QualityTestStandardParam>lambdaQuery().eq(QualityTestStandardParam::getTestStandardId, testStandardId)));
     }
 
 }
diff --git a/src/main/java/com/ruoyi/quality/controller/QualityTestStandardParamController.java b/src/main/java/com/ruoyi/quality/controller/QualityTestStandardParamController.java
index e5c883c..16788c9 100644
--- a/src/main/java/com/ruoyi/quality/controller/QualityTestStandardParamController.java
+++ b/src/main/java/com/ruoyi/quality/controller/QualityTestStandardParamController.java
@@ -2,10 +2,14 @@
 
 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.framework.web.domain.R;
 import com.ruoyi.quality.pojo.QualityTestStandard;
 import com.ruoyi.quality.pojo.QualityTestStandardParam;
 import com.ruoyi.quality.service.QualityTestStandardParamService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.AllArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
@@ -24,6 +28,7 @@
 @RestController
 @RequestMapping("/qualityTestStandardParam")
 @AllArgsConstructor
+@Tag(name = "妫�娴嬫爣鍑嗗弬鏁�")
 public class QualityTestStandardParamController {
 
     private QualityTestStandardParamService qualityTestStandardParamService;
@@ -34,8 +39,10 @@
      * @return
      */
     @PostMapping("/add")
-    public AjaxResult add(@RequestBody QualityTestStandardParam qualityTestStandardParam) {
-        return AjaxResult.success(qualityTestStandardParamService.save(qualityTestStandardParam));
+    @Operation(summary = "鏂板妫�娴嬫爣鍑嗗弬鏁�")
+    @Log(title = "鏂板妫�娴嬫爣鍑嗗弬鏁�", businessType = BusinessType.INSERT)
+    public R<?> add(@RequestBody QualityTestStandardParam qualityTestStandardParam) {
+        return R.ok(qualityTestStandardParamService.save(qualityTestStandardParam));
     }
 
     /**
@@ -44,11 +51,13 @@
      * @return
      */
     @DeleteMapping("/del")
-    public AjaxResult delQualityTestStandard(@RequestBody List<Integer> ids) {
+    @Operation(summary = "鍒犻櫎妫�娴嬫寚鏍囩淮鎶�")
+    @Log(title = "鍒犻櫎妫�娴嬫寚鏍囩淮鎶�", businessType = BusinessType.DELETE)
+    public R<?> delQualityTestStandard(@RequestBody List<Integer> ids) {
         if(CollectionUtils.isEmpty(ids)){
-            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+            return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         }
-        return AjaxResult.success(qualityTestStandardParamService.removeBatchByIds(ids));
+        return R.ok(qualityTestStandardParamService.removeBatchByIds(ids));
     }
 
     /**
@@ -57,8 +66,10 @@
      * @return
      */
     @PostMapping("/update")
-    public AjaxResult update(@RequestBody QualityTestStandardParam qualityTestStandardParam) {
-        return AjaxResult.success(qualityTestStandardParamService.updateById(qualityTestStandardParam));
+    @Operation(summary = "妫�娴嬫寚鏍囩淮鎶や慨鏀�")
+    @Log(title = "妫�娴嬫寚鏍囩淮鎶や慨鏀�", businessType = BusinessType.UPDATE)
+    public R<?> update(@RequestBody QualityTestStandardParam qualityTestStandardParam) {
+        return R.ok(qualityTestStandardParamService.updateById(qualityTestStandardParam));
     }
 
     /**
@@ -66,8 +77,10 @@
      * @return
      */
     @GetMapping("/list")
-    public AjaxResult list(Long testStandardId) {
-        return AjaxResult.success(qualityTestStandardParamService.list(Wrappers.<QualityTestStandardParam>lambdaQuery().eq(QualityTestStandardParam::getTestStandardId,testStandardId)));
+    @Operation(summary = "妫�娴嬫寚鏍囩淮鎶ゆ煡璇�")
+    @Log(title = "妫�娴嬫寚鏍囩淮鎶ゆ煡璇�", businessType = BusinessType.OTHER)
+    public R<?> list(Long testStandardId) {
+        return R.ok(qualityTestStandardParamService.list(Wrappers.<QualityTestStandardParam>lambdaQuery().eq(QualityTestStandardParam::getTestStandardId,testStandardId)));
     }
 
 }
diff --git a/src/main/java/com/ruoyi/quality/controller/QualityUnqualifiedController.java b/src/main/java/com/ruoyi/quality/controller/QualityUnqualifiedController.java
index 3b20f82..a2222c3 100644
--- a/src/main/java/com/ruoyi/quality/controller/QualityUnqualifiedController.java
+++ b/src/main/java/com/ruoyi/quality/controller/QualityUnqualifiedController.java
@@ -1,9 +1,13 @@
 package com.ruoyi.quality.controller;
 
 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.framework.web.domain.R;
 import com.ruoyi.quality.pojo.QualityUnqualified;
 import com.ruoyi.quality.service.IQualityUnqualifiedService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
@@ -16,6 +20,7 @@
  */
 @RestController
 @RequestMapping("/quality/qualityUnqualified")
+@Tag(name = "涓嶅悎鏍肩鐞�")
 public class QualityUnqualifiedController {
 
     @Resource
@@ -28,9 +33,11 @@
      * @return
      */
     @PostMapping("/add")
-    public AjaxResult add(@RequestBody QualityUnqualified qualityUnqualified) {
+    @Operation(summary = "鏂板涓嶅悎鏍肩鐞�")
+    @Log(title = "鏂板涓嶅悎鏍肩鐞�", businessType = BusinessType.INSERT)
+    public R<?> add(@RequestBody QualityUnqualified qualityUnqualified) {
         qualityUnqualified.setInspectState(0);
-        return AjaxResult.success(qualityUnqualifiedService.save(qualityUnqualified));
+        return R.ok(qualityUnqualifiedService.save(qualityUnqualified));
     }
 
     /**
@@ -39,13 +46,15 @@
      * @return
      */
     @DeleteMapping("/del")
-    public AjaxResult delQualityUnqualified(@RequestBody List<Integer> ids) {
+    @Operation(summary = "鍒犻櫎涓嶅悎鏍肩鐞�")
+    @Log(title = "鍒犻櫎涓嶅悎鏍肩鐞�", businessType = BusinessType.DELETE)
+    public R<?> delQualityUnqualified(@RequestBody List<Integer> ids) {
        qualityUnqualifiedService.listByIds(ids).stream().forEach(qualityUnqualified -> {
            if (qualityUnqualified.getInspectState()==1){
                throw new RuntimeException("璇ヤ笉鍚堟牸鏁版嵁宸茬粡澶勭悊鏃犳硶鍒犻櫎!");
            }
        });
-        return AjaxResult.success(qualityUnqualifiedService.removeBatchByIds(ids));
+        return R.ok(qualityUnqualifiedService.removeBatchByIds(ids));
     }
 
     /**
@@ -54,8 +63,10 @@
      * @return
      */
     @GetMapping("/{id}")
-    public AjaxResult QualityUnqualifiedDetail(@PathVariable("id") Integer id) {
-        return AjaxResult.success(qualityUnqualifiedService.getUnqualified(id));
+    @Operation(summary = "涓嶅悎鏍肩鐞嗚鎯�")
+    @Log(title = "涓嶅悎鏍肩鐞嗚鎯�", businessType = BusinessType.OTHER)
+    public R<?> QualityUnqualifiedDetail(@PathVariable("id") Integer id) {
+        return R.ok(qualityUnqualifiedService.getUnqualified(id));
     }
 
     /**
@@ -64,8 +75,10 @@
      * @return
      */
     @PostMapping("/update")
-    public AjaxResult update(@RequestBody QualityUnqualified qualityUnqualified) {
-        return AjaxResult.success(qualityUnqualifiedService.updateById(qualityUnqualified));
+    @Operation(summary = "涓嶅悎鏍肩鐞嗕慨鏀�")
+    @Log(title = "涓嶅悎鏍肩鐞嗕慨鏀�", businessType = BusinessType.UPDATE)
+    public R<?> update(@RequestBody QualityUnqualified qualityUnqualified) {
+        return R.ok(qualityUnqualifiedService.updateById(qualityUnqualified));
     }
 
     /**
@@ -75,8 +88,10 @@
      * @return
      */
     @GetMapping("/listPage")
-    public AjaxResult qualityUnqualifiedListPage(Page page, QualityUnqualified qualityUnqualified) {
-        return AjaxResult.success(qualityUnqualifiedService.qualityUnqualifiedListPage(page, qualityUnqualified));
+    @Operation(summary = "涓嶅悎鏍肩鐞嗗垎椤垫煡璇�")
+    @Log(title = "涓嶅悎鏍肩鐞嗗垎椤垫煡璇�", businessType = BusinessType.OTHER)
+    public R<?> qualityUnqualifiedListPage(Page page, QualityUnqualified qualityUnqualified) {
+        return R.ok(qualityUnqualifiedService.qualityUnqualifiedListPage(page, qualityUnqualified));
     }
 
     /**
@@ -85,6 +100,8 @@
      * @param qualityUnqualified
      */
     @PostMapping("/export")
+    @Operation(summary = "涓嶅悎鏍肩鐞嗗鍑�")
+    @Log(title = "涓嶅悎鏍肩鐞嗗鍑�", businessType = BusinessType.EXPORT)
     public void qualityUnqualifiedExport(HttpServletResponse response,QualityUnqualified qualityUnqualified) {
         qualityUnqualifiedService.qualityUnqualifiedExport(response, qualityUnqualified);
     }
@@ -95,8 +112,10 @@
      * @return
      */
     @PostMapping("/deal")
-    public AjaxResult deal(@RequestBody QualityUnqualified qualityUnqualified) {
-        return AjaxResult.success(qualityUnqualifiedService.deal(qualityUnqualified));
+    @Operation(summary = "涓嶅悎鏍肩鐞嗗鐞�")
+    @Log(title = "涓嶅悎鏍肩鐞嗗鐞�", businessType = BusinessType.OTHER)
+    public R<?> deal(@RequestBody QualityUnqualified qualityUnqualified) {
+        return R.ok(qualityUnqualifiedService.deal(qualityUnqualified));
     }
 
 
diff --git a/src/main/java/com/ruoyi/quality/pojo/QualityUnqualified.java b/src/main/java/com/ruoyi/quality/pojo/QualityUnqualified.java
index 31984af..249299a 100644
--- a/src/main/java/com/ruoyi/quality/pojo/QualityUnqualified.java
+++ b/src/main/java/com/ruoyi/quality/pojo/QualityUnqualified.java
@@ -143,4 +143,7 @@
 
     @TableField(fill = FieldFill.INSERT)
     private Long deptId;
+
+    @Schema(description = "鍏宠仈浜у搧鍨嬪彿id")
+    private Long productModelId;
 }
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 625ff8b..345d49c 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -121,10 +121,12 @@
             BeanUtils.copyProperties(qualityInspect, qualityUnqualified);
             qualityUnqualified.setInspectState(0);//寰呭鐞�
             qualityUnqualified.setQuantity(qualityInspect.getUnqualifiedQuantity());
+            qualityUnqualified.setProductModelId(qualityInspect.getProductModelId());
             List<QualityInspectParam> inspectParams = qualityInspectParamService.list(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, inspect.getId()));
             String text = inspectParams.stream().map(QualityInspectParam::getParameterItem).collect(Collectors.joining(","));
             qualityUnqualified.setDefectivePhenomena(text + "杩欎簺鎸囨爣涓瓨鍦ㄤ笉鍚堟牸");//涓嶅悎鏍肩幇璞�
             qualityUnqualified.setInspectId(qualityInspect.getId());
+            qualityUnqualified.setId(null);
             qualityUnqualifiedMapper.insert(qualityUnqualified);
         }
 
diff --git a/src/main/java/com/ruoyi/sales/controller/CommonFileController.java b/src/main/java/com/ruoyi/sales/controller/CommonFileController.java
index 37266a8..c97a55a 100644
--- a/src/main/java/com/ruoyi/sales/controller/CommonFileController.java
+++ b/src/main/java/com/ruoyi/sales/controller/CommonFileController.java
@@ -3,7 +3,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.sales.service.ICommonFileService;
 import lombok.AllArgsConstructor;
 import org.springframework.web.bind.annotation.DeleteMapping;
@@ -26,11 +26,12 @@
      */
     @Log(title = "闄勪欢鍒犻櫎", businessType = BusinessType.DELETE)
     @DeleteMapping("/delCommonFile")
-    public AjaxResult delCommonFile(@RequestBody Long[] ids) {
+    public R<?> delCommonFile(@RequestBody Long[] ids) {
         if (ids == null || ids.length == 0) {
-            return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+            return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
         }
-        return toAjax(commonFileService.delCommonFileByIds(ids));
+        commonFileService.delCommonFileByIds(ids);
+        return R.ok();
     }
 
     public void migrateTempFilesToFormal(Long businessId, List<String> tempFileIds) throws IOException{
diff --git a/src/main/java/com/ruoyi/sales/controller/InvoiceLedgerController.java b/src/main/java/com/ruoyi/sales/controller/InvoiceLedgerController.java
index 0559ff8..3b4f493 100644
--- a/src/main/java/com/ruoyi/sales/controller/InvoiceLedgerController.java
+++ b/src/main/java/com/ruoyi/sales/controller/InvoiceLedgerController.java
@@ -3,7 +3,8 @@
 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.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.sales.dto.InvoiceLedgerDto;
 import com.ruoyi.sales.dto.InvoiceRegistrationProductDto;
 import com.ruoyi.sales.mapper.InvoiceLedgerFileMapper;
@@ -20,7 +21,7 @@
 @RestController
 @RequestMapping("/invoiceLedger")
 @AllArgsConstructor
-public class InvoiceLedgerController {
+public class InvoiceLedgerController extends BaseController {
 
     private InvoiceLedgerService invoiceLedgerService;
     private InvoiceLedgerFileMapper invoiceLedgerFileMapper;
@@ -31,9 +32,9 @@
      * @return
      */
     @PostMapping("/saveOrUpdate")
-    public AjaxResult invoiceLedgerSaveOrUpdate(@RequestBody InvoiceRegistrationProductDto productDto) {
+    public R<?> invoiceLedgerSaveOrUpdate(@RequestBody InvoiceRegistrationProductDto productDto) {
         invoiceLedgerService.invoiceLedgerSaveOrUpdate(productDto);
-        return AjaxResult.success();
+        return R.ok();
     }
 
     /**
@@ -42,9 +43,9 @@
      * @return
      */
     @DeleteMapping("/del")
-    public AjaxResult invoiceLedgerDel(@RequestBody List<Integer> ids) {
+    public R<?> invoiceLedgerDel(@RequestBody List<Integer> ids) {
         invoiceLedgerService.invoiceLedgerDel(ids);
-        return AjaxResult.success();
+        return R.ok();
     }
 
     /**
@@ -54,8 +55,8 @@
      * @return
      */
     @GetMapping("/page")
-    public AjaxResult invoiceLedgerPage(Page page, InvoiceLedgerDto invoiceLedgerDto) {
-        return AjaxResult.success(invoiceLedgerService.invoiceLedgerPage(page, invoiceLedgerDto));
+    public R<?> invoiceLedgerPage(Page page, InvoiceLedgerDto invoiceLedgerDto) {
+        return R.ok(invoiceLedgerService.invoiceLedgerPage(page, invoiceLedgerDto));
     }
 
     /**
@@ -64,8 +65,8 @@
      * @return
      */
     @GetMapping("/fileList")
-    public AjaxResult invoiceLedgerFileList(Integer invoiceLedgerId) {
-        return AjaxResult.success(invoiceLedgerService.invoiceLedgerFileList(invoiceLedgerId));
+    public R<?> invoiceLedgerFileList(Integer invoiceLedgerId) {
+        return R.ok(invoiceLedgerService.invoiceLedgerFileList(invoiceLedgerId));
     }
 
     /**
@@ -73,10 +74,10 @@
      */
     @DeleteMapping("/delFile")
     @Log(title = "寮�绁ㄥ彴璐�", businessType = BusinessType.DELETE)
-    public AjaxResult invoiceLedgerDelFile(@RequestBody List<Integer> ids) {
-        if(Collections.isEmpty(ids)) return AjaxResult.error("璇烽�夋嫨瑕佸垹闄ょ殑鏂囦欢");
+    public R<?> invoiceLedgerDelFile(@RequestBody List<Integer> ids) {
+        if(Collections.isEmpty(ids)) return R.fail("璇烽�夋嫨瑕佸垹闄ょ殑鏂囦欢");
         invoiceLedgerFileMapper.deleteBatchIds(ids);
-        return AjaxResult.success();
+        return R.ok();
     }
 
 
@@ -87,11 +88,11 @@
      * @return
      */
     @PostMapping("/uploadFile")
-    public AjaxResult invoiceLedgerUploadFile(MultipartFile file) {
+    public R<?> invoiceLedgerUploadFile(MultipartFile file) {
         try {
-            return AjaxResult.success(invoiceLedgerService.invoiceLedgerUploadFile(file));
+            return R.ok(invoiceLedgerService.invoiceLedgerUploadFile(file));
         }catch (Exception e) {
-            return AjaxResult.error(e.getMessage());
+            return R.fail(e.getMessage());
         }
     }
 
@@ -112,8 +113,8 @@
      * @return
      */
     @GetMapping("/info")
-    public AjaxResult invoiceLedgerInfo(Integer id) {
-        return AjaxResult.success(invoiceLedgerService.invoiceLedgerDetail(id));
+    public R<?> invoiceLedgerInfo(Integer id) {
+        return R.ok(invoiceLedgerService.invoiceLedgerDetail(id));
     }
 
     /**
@@ -122,12 +123,12 @@
      * @return
      */
     @PostMapping("/commitFile")
-    public AjaxResult invoiceLedgerCommitFile(@RequestBody InvoiceLedgerDto invoiceLedgerDto) {
+    public R<?> invoiceLedgerCommitFile(@RequestBody InvoiceLedgerDto invoiceLedgerDto) {
         try {
             invoiceLedgerService.invoiceLedgerCommitFile(invoiceLedgerDto);
-            return AjaxResult.success();
+            return R.ok();
         }catch (Exception e) {
-            return AjaxResult.error(e.getMessage());
+            return R.fail(e.getMessage());
         }
     }
 
@@ -137,8 +138,8 @@
      * @return
      */
     @GetMapping("/list")
-    public AjaxResult invoiceLedgerList(InvoiceLedgerDto invoiceLedgerDto) {
-        return AjaxResult.success(invoiceLedgerService.invoiceLedgerList(invoiceLedgerDto));
+    public R<?> invoiceLedgerList(InvoiceLedgerDto invoiceLedgerDto) {
+        return R.ok(invoiceLedgerService.invoiceLedgerList(invoiceLedgerDto));
     }
 
     /**
@@ -148,20 +149,20 @@
      * @return
      */
     @GetMapping("/salesAccount")
-    public AjaxResult invoiceLedgerSalesAccount(Page page, InvoiceLedgerDto invoiceLedgerDto) {
-        return AjaxResult.success(invoiceLedgerService.invoiceLedgerSalesAccount(page,invoiceLedgerDto));
+    public R<?> invoiceLedgerSalesAccount(Page page, InvoiceLedgerDto invoiceLedgerDto) {
+        return R.ok(invoiceLedgerService.invoiceLedgerSalesAccount(page,invoiceLedgerDto));
     }
 
     /**
      * 鏈湀寮�绁ㄩ噾棰�
      */
     @GetMapping("/getInvoiceAmount")
-    public AjaxResult getInvoiceAmount() {
+    public R<?> getInvoiceAmount() {
         try {
             BigDecimal amount = invoiceLedgerService.getInvoiceAmount();
-            return AjaxResult.success(amount != null ? amount : BigDecimal.ZERO);
+            return R.ok(amount != null ? amount : BigDecimal.ZERO);
         } catch (Exception e) {
-            return AjaxResult.error("鑾峰彇寮�绁ㄩ噾棰濆け璐ワ細" + e.getMessage());
+            return R.fail("鑾峰彇寮�绁ㄩ噾棰濆け璐ワ細" + e.getMessage());
         }
     }
 
@@ -172,9 +173,9 @@
      * @return
      */
     @GetMapping("/registrationProductPage")
-    public AjaxResult registrationProductPage(Page page, InvoiceRegistrationProductDto registrationProductDto) {
+    public R<?> registrationProductPage(Page page, InvoiceRegistrationProductDto registrationProductDto) {
 
-        return AjaxResult.success(invoiceLedgerService.registrationProductPage(page,registrationProductDto));
+        return R.ok(invoiceLedgerService.registrationProductPage(page,registrationProductDto));
     }
 
     /**
@@ -183,8 +184,8 @@
      * @return
      */
     @GetMapping("/invoiceLedgerProductInfo")
-    public AjaxResult invoiceLedgerProductDetail(Integer id) {
-        return AjaxResult.success(invoiceLedgerService.invoiceLedgerProductDetail(id));
+    public R<?> invoiceLedgerProductDetail(Integer id) {
+        return R.ok(invoiceLedgerService.invoiceLedgerProductDetail(id));
     }
 
     /**
@@ -193,12 +194,12 @@
      * @return
      */
     @DeleteMapping("delInvoiceLedger/{invoiceRegistrationProductId}")
-    public AjaxResult delInvoiceLedger(@PathVariable Integer invoiceRegistrationProductId) {
+    public R<?> delInvoiceLedger(@PathVariable Integer invoiceRegistrationProductId) {
         try {
             invoiceLedgerService.delInvoiceLedger(invoiceRegistrationProductId);
-            return AjaxResult.success();
+            return R.ok();
         }catch (Exception e) {
-            return AjaxResult.error(e.getMessage());
+            return R.fail(e.getMessage());
         }
     }
 
diff --git a/src/main/java/com/ruoyi/sales/controller/InvoiceRegistrationController.java b/src/main/java/com/ruoyi/sales/controller/InvoiceRegistrationController.java
index 8ea6c11..09447b1 100644
--- a/src/main/java/com/ruoyi/sales/controller/InvoiceRegistrationController.java
+++ b/src/main/java/com/ruoyi/sales/controller/InvoiceRegistrationController.java
@@ -2,7 +2,8 @@
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.sales.dto.InvoiceRegistrationDto;
 import com.ruoyi.sales.dto.InvoiceRegistrationProductDto;
 import com.ruoyi.sales.dto.SalesLedgerDto;
@@ -18,7 +19,7 @@
 @RestController
 @RequestMapping("/invoiceRegistration")
 @AllArgsConstructor
-public class InvoiceRegistrationController {
+public class InvoiceRegistrationController extends BaseController {
 
     private InvoiceRegistrationService invoiceRegistrationService;
 
@@ -30,13 +31,13 @@
     @PostMapping("/save")
     @Log(title = "寮�绁ㄧ櫥璁�", businessType = com.ruoyi.framework.aspectj.lang.enums.BusinessType.INSERT)
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult invoiceRegistrationSave(@RequestBody List<SalesLedgerDto> salesLedgerDto) {
-        if(Collections.isEmpty(salesLedgerDto)) return AjaxResult.error("璇烽�夋嫨瑕佷繚瀛樼殑璁板綍");
+    public R<?> invoiceRegistrationSave(@RequestBody List<SalesLedgerDto> salesLedgerDto) {
+        if(Collections.isEmpty(salesLedgerDto)) return R.fail("璇烽�夋嫨瑕佷繚瀛樼殑璁板綍");
         salesLedgerDto.forEach(item ->{
             invoiceRegistrationService.invoiceRegistrationSave(item);
         });
 
-        return AjaxResult.success();
+        return R.ok();
     }
 
     /**
@@ -45,9 +46,9 @@
      * @return
      */
     @DeleteMapping("/del")
-    public AjaxResult invoiceRegistrationDel(@RequestBody  List<Integer> ids) {
+    public R<?> invoiceRegistrationDel(@RequestBody  List<Integer> ids) {
         invoiceRegistrationService.invoiceRegistrationDel(ids);
-        return AjaxResult.success();
+        return R.ok();
     }
 
     /**
@@ -56,9 +57,9 @@
      * @return
      */
     @PostMapping("/update")
-    public AjaxResult invoiceRegistrationUpdate(@RequestBody InvoiceRegistrationDto invoiceRegistrationDto) {
+    public R<?> invoiceRegistrationUpdate(@RequestBody InvoiceRegistrationDto invoiceRegistrationDto) {
         invoiceRegistrationService.invoiceRegistrationUpdate(invoiceRegistrationDto);
-        return AjaxResult.success();
+        return R.ok();
     }
 
     /**
@@ -68,8 +69,8 @@
      * @return
      */
     @GetMapping("/listPage")
-    public AjaxResult invoiceRegistrationListPage(Page page, InvoiceRegistrationDto invoiceRegistrationDto) {
-        return AjaxResult.success(invoiceRegistrationService.invoiceRegistrationListPage(page, invoiceRegistrationDto));
+    public R<?> invoiceRegistrationListPage(Page page, InvoiceRegistrationDto invoiceRegistrationDto) {
+        return R.ok(invoiceRegistrationService.invoiceRegistrationListPage(page, invoiceRegistrationDto));
     }
 
     /**
@@ -78,8 +79,8 @@
      * @return
      */
     @GetMapping("/productList")
-    public AjaxResult invoiceRegistrationProductList(InvoiceRegistrationProductDto invoiceRegistrationProductDto) {
-        return AjaxResult.success(invoiceRegistrationService.invoiceRegistrationProductList(invoiceRegistrationProductDto));
+    public R<?> invoiceRegistrationProductList(InvoiceRegistrationProductDto invoiceRegistrationProductDto) {
+        return R.ok(invoiceRegistrationService.invoiceRegistrationProductList(invoiceRegistrationProductDto));
     }
 
     /**
@@ -88,8 +89,8 @@
      * @return
      */
     @GetMapping("/detail")
-    public AjaxResult invoiceRegistrationDetail(Integer id) {
-        return AjaxResult.success(invoiceRegistrationService.invoiceRegistrationDetail(id));
+    public R<?> invoiceRegistrationDetail(Integer id) {
+        return R.ok(invoiceRegistrationService.invoiceRegistrationDetail(id));
     }
 
     /**
diff --git a/src/main/java/com/ruoyi/sales/controller/MetricStatisticsController.java b/src/main/java/com/ruoyi/sales/controller/MetricStatisticsController.java
index 8ad4f02..5f58c0d 100644
--- a/src/main/java/com/ruoyi/sales/controller/MetricStatisticsController.java
+++ b/src/main/java/com/ruoyi/sales/controller/MetricStatisticsController.java
@@ -1,7 +1,7 @@
 package com.ruoyi.sales.controller;
 
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.sales.dto.StatisticsTableDto;
 import com.ruoyi.sales.service.impl.MetricStatisticsServiceImpl;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -25,13 +25,13 @@
 
     @Operation(summary = "澶撮儴鎬昏")
     @GetMapping("/total")
-    public AjaxResult total() {
+    public R<?> total() {
         return metricStatisticsService.total();
     }
 
     @Operation(summary = "缁熻琛�")
     @GetMapping("/statisticsTable")
-    public AjaxResult statisticsTable(StatisticsTableDto statisticsTableDto) {
+    public R<?> statisticsTable(StatisticsTableDto statisticsTableDto) {
         return metricStatisticsService.statisticsTable(statisticsTableDto);
     }
 
diff --git a/src/main/java/com/ruoyi/sales/controller/PaymentShippingController.java b/src/main/java/com/ruoyi/sales/controller/PaymentShippingController.java
index f88a0e6..ce70940 100644
--- a/src/main/java/com/ruoyi/sales/controller/PaymentShippingController.java
+++ b/src/main/java/com/ruoyi/sales/controller/PaymentShippingController.java
@@ -5,7 +5,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.utils.OrderUtils;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.sales.mapper.PaymentShippingMapper;
 import com.ruoyi.sales.pojo.PaymentShipping;
 import com.ruoyi.sales.service.PaymentShippingService;
@@ -32,37 +32,37 @@
 
     @GetMapping("/listPage")
     @Operation(summary = "鍒嗛〉鏌ヨ鏀粯涓庡彂璐т俊鎭�")
-    public AjaxResult listPage(Page page, PaymentShipping paymentShipping) {
+    public R<?> listPage(Page page, PaymentShipping paymentShipping) {
         IPage<PaymentShipping> listPage = paymentShippingService.listPage(page, paymentShipping);
-        return AjaxResult.success(listPage);
+        return R.ok(listPage);
     }
 
     @PostMapping("/add")
     @Operation(summary = "娣诲姞鏀粯涓庡彂璐т俊鎭�")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult add(@RequestBody PaymentShipping paymentShipping) {
+    public R<?> add(@RequestBody PaymentShipping paymentShipping) {
         String ord = OrderUtils.countTodayByCreateTime(paymentShippingMapper, "ORD","order_no");
         paymentShipping.setOrderNo(ord);
         boolean save = paymentShippingService.save(paymentShipping);
-        return save ? success() : error();
+        return save ? R.ok() : R.fail();
     }
 
     @PostMapping("/update")
     @Operation(summary = "淇敼鏀粯涓庡彂璐т俊鎭�")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult update(@RequestBody PaymentShipping paymentShipping) {
+    public R<?> update(@RequestBody PaymentShipping paymentShipping) {
         boolean update = paymentShippingService.updateById(paymentShipping);
-        return update ? success() : error();
+        return update ? R.ok() : R.fail();
     }
 
     @DeleteMapping("/delete")
     @Operation(summary = "鍒犻櫎鏀粯涓庡彂璐т俊鎭�")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult delete(@RequestBody List<Long> ids){
+    public R<?> delete(@RequestBody List<Long> ids){
         if (CollectionUtils.isEmpty(ids)){
-            return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+            return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
         }
-        return AjaxResult.success(paymentShippingService.removeByIds(ids));
+        return R.ok(paymentShippingService.removeByIds(ids));
     }
 
 }
diff --git a/src/main/java/com/ruoyi/sales/controller/ReceiptPaymentController.java b/src/main/java/com/ruoyi/sales/controller/ReceiptPaymentController.java
index 5512a8d..7d91849 100644
--- a/src/main/java/com/ruoyi/sales/controller/ReceiptPaymentController.java
+++ b/src/main/java/com/ruoyi/sales/controller/ReceiptPaymentController.java
@@ -7,7 +7,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.framework.web.page.TableDataInfo;
 import com.ruoyi.sales.dto.InvoiceLedgerDto;
 import com.ruoyi.sales.dto.ReceiptPaymentDto;
@@ -39,9 +39,9 @@
      * @return
      */
     @PostMapping("/saveOrUpdate")
-    public AjaxResult receiptPaymentSaveOrUpdate (@RequestBody List<ReceiptPayment> receiptPayment) {
+    public R<?> receiptPaymentSaveOrUpdate (@RequestBody List<ReceiptPayment> receiptPayment) {
         receiptPaymentService.receiptPaymentSaveOrUpdate(receiptPayment);
-        return AjaxResult.success();
+        return R.ok();
     }
 
     /**
@@ -51,8 +51,8 @@
      */
     @PostMapping("/update")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult receiptPaymentUpdate (@RequestBody ReceiptPayment receiptPayment) {
-        return AjaxResult.success(receiptPaymentService.receiptPaymentUpdate(receiptPayment));
+    public R<?> receiptPaymentUpdate (@RequestBody ReceiptPayment receiptPayment) {
+        return R.ok(receiptPaymentService.receiptPaymentUpdate(receiptPayment));
     }
 
     /**
@@ -62,8 +62,8 @@
      */
     @DeleteMapping("/del")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult receiptPaymentDel (@RequestBody List<Integer> ids) {
-        return AjaxResult.success(receiptPaymentService.receiptPaymentDel(ids));
+    public R<?> receiptPaymentDel (@RequestBody List<Integer> ids) {
+        return R.ok(receiptPaymentService.receiptPaymentDel(ids));
     }
 
     /**
@@ -72,8 +72,8 @@
      * @return
      */
     @GetMapping("/customerInteractions")
-    public AjaxResult customerInteractions (InvoiceLedgerDto receiptPaymentDto) {
-        return AjaxResult.success(receiptPaymentService.customerInteractions(receiptPaymentDto));
+    public R<?> customerInteractions (InvoiceLedgerDto receiptPaymentDto) {
+        return R.ok(receiptPaymentService.customerInteractions(receiptPaymentDto));
     }
 
     /**
@@ -82,20 +82,20 @@
      * @return
      */
     @GetMapping("/info")
-    public AjaxResult receiptPaymentInfo (Integer id) {
-        return AjaxResult.success(receiptPaymentService.receiptPaymentInfo(id));
+    public R<?> receiptPaymentInfo (Integer id) {
+        return R.ok(receiptPaymentService.receiptPaymentInfo(id));
     }
 
     /**
      * 鏈湀鍥炴閲戦
      */
     @GetMapping("/getReceiptAmount")
-    public AjaxResult getReceiptAmount() {
+    public R<?> getReceiptAmount() {
         try {
             BigDecimal receiptAmount = receiptPaymentService.getReceiptAmount();
-            return AjaxResult.success(receiptAmount != null ? receiptAmount : BigDecimal.ZERO);
+            return R.ok(receiptAmount != null ? receiptAmount : BigDecimal.ZERO);
         } catch (Exception e) {
-            return AjaxResult.error("鑾峰彇鍥炴閲戦澶辫触锛�" + e.getMessage());
+            return R.fail("鑾峰彇鍥炴閲戦澶辫触锛�" + e.getMessage());
         }
     }
 
@@ -106,8 +106,8 @@
      * @return
      */
     @GetMapping("/bindInvoiceNoRegPage")
-    public AjaxResult bindInvoiceNoRegPage(Page page, ReceiptPaymentDto receiptPaymentDto) {
-        return AjaxResult.success(receiptPaymentService.bindInvoiceNoRegPage(page,receiptPaymentDto));
+    public R<?> bindInvoiceNoRegPage(Page page, ReceiptPaymentDto receiptPaymentDto) {
+        return R.ok(receiptPaymentService.bindInvoiceNoRegPage(page,receiptPaymentDto));
     }
 
     @Schema(description = "瀵煎嚭鍥炴鐧昏")
@@ -131,16 +131,16 @@
      * @return
      */
     @GetMapping("/invoiceInfo")
-    public AjaxResult invoiceInfo (Integer id) {
-        return AjaxResult.success(receiptPaymentService.invoiceInfo(id));
+    public R<?> invoiceInfo (Integer id) {
+        return R.ok(receiptPaymentService.invoiceInfo(id));
     }
 
     /**
      * 鏈湀搴旀敹,鍥炴閲戦
      */
     @GetMapping("/getAmountMouth")
-    public AjaxResult getAmountMouth() {
-        return  AjaxResult.success(receiptPaymentService.getAmountMouth());
+    public R<?> getAmountMouth() {
+        return  R.ok(receiptPaymentService.getAmountMouth());
     }
 
     /**
diff --git a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
index ceb3702..dfca752 100644
--- a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
+++ b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -10,7 +10,6 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.framework.web.page.TableDataInfo;
 import com.ruoyi.sales.dto.InvoiceLedgerDto;
@@ -67,7 +66,7 @@
     @Log(title = "瀵煎叆閿�鍞彴璐�", businessType = BusinessType.INSERT)
     @PostMapping("/import")
     @Operation(summary = "瀵煎叆閿�鍞彴璐�")
-    public AjaxResult importData(@RequestParam("file")
+    public R<?> importData(@RequestParam("file")
                                  @ApiParam(value = "Excel鏂囦欢", required = true)
                                  MultipartFile file) {
         return salesLedgerService.importData(file);
@@ -183,8 +182,9 @@
      */
     @Log(title = "閿�鍞彴璐�", businessType = BusinessType.INSERT)
     @PostMapping("/addOrUpdateSalesLedger")
-    public AjaxResult add(@RequestBody SalesLedgerDto salesLedgerDto) {
-        return toAjax(salesLedgerService.addOrUpdateSalesLedger(salesLedgerDto));
+    public R<?> add(@RequestBody SalesLedgerDto salesLedgerDto) {
+        salesLedgerService.addOrUpdateSalesLedger(salesLedgerDto);
+        return R.ok();
     }
 
     /**
@@ -192,11 +192,12 @@
      */
     @Log(title = "閿�鍞彴璐�", businessType = BusinessType.DELETE)
     @DeleteMapping("/delLedger")
-    public AjaxResult remove(@RequestBody Long[] ids) {
+    public R<?> remove(@RequestBody Long[] ids) {
         if (ids == null || ids.length == 0) {
-            return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+            return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
         }
-        return toAjax(salesLedgerService.deleteSalesLedgerByIds(ids));
+        salesLedgerService.deleteSalesLedgerByIds(ids);
+        return R.ok();
     }
 
     /**
@@ -206,9 +207,9 @@
      * @return
      */
     @GetMapping("/listNoPage")
-    public AjaxResult listNoPage(SalesLedgerDto salesLedgerDto) {
+    public R<?> listNoPage(SalesLedgerDto salesLedgerDto) {
         List<SalesLedger> list = salesLedgerService.selectSalesLedgerList(salesLedgerDto);
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
 
     /**
@@ -216,23 +217,24 @@
      */
     @Log(title = "閿�鍞彴璐﹂檮浠跺垹闄�", businessType = BusinessType.DELETE)
     @DeleteMapping("/delLedgerFile")
-    public AjaxResult delLedgerFile(@RequestBody Long[] ids) {
+    public R<?> delLedgerFile(@RequestBody Long[] ids) {
         if (ids == null || ids.length == 0) {
-            return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+            return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
         }
-        return toAjax(commonFileService.deleteSalesLedgerByIds(ids));
+        commonFileService.deleteSalesLedgerByIds(ids);
+        return R.ok();
     }
 
     /**
      * 鏈湀閿�鍞悎鍚岄噾棰�
      */
     @GetMapping("/getContractAmount")
-    public AjaxResult getContractAmount() {
+    public R<?> getContractAmount() {
         try {
             BigDecimal contractAmount = salesLedgerService.getContractAmount();
-            return AjaxResult.success(contractAmount != null ? contractAmount : BigDecimal.ZERO);
+            return R.ok(contractAmount != null ? contractAmount : BigDecimal.ZERO);
         } catch (Exception e) {
-            return AjaxResult.error("鑾峰彇鍚堝悓閲戦澶辫触锛�" + e.getMessage());
+            return R.fail("鑾峰彇鍚堝悓閲戦澶辫触锛�" + e.getMessage());
         }
     }
 
@@ -240,16 +242,16 @@
      * 瀹㈡埛鍚堝悓閲戦TOP5缁熻
      */
     @GetMapping("/getTopFiveList")
-    public AjaxResult getTopFiveList() {
-        return AjaxResult.success(salesLedgerService.getTopFiveList());
+    public R<?> getTopFiveList() {
+        return R.ok(salesLedgerService.getTopFiveList());
     }
 
     /**
      * 杩戝崐骞村紑绁�,鍥炴閲戦
      */
     @GetMapping("/getAmountHalfYear")
-    public AjaxResult getAmountHalfYear(@RequestParam(value = "type",defaultValue = "1") Integer type) {
-        return AjaxResult.success(salesLedgerService.getAmountHalfYear(type));
+    public R<?> getAmountHalfYear(@RequestParam(value = "type",defaultValue = "1") Integer type) {
+        return R.ok(salesLedgerService.getAmountHalfYear(type));
     }
 
     /**
diff --git a/src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java b/src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
index 9485919..f487aea 100644
--- a/src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
+++ b/src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
@@ -7,7 +7,6 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.procurementrecord.service.ProcurementRecordService;
 import com.ruoyi.procurementrecord.utils.StockUtils;
@@ -46,9 +45,9 @@
      * 鍥炴鐧昏鍒嗛〉鏌ヨ
      */
     @GetMapping("/listPageSalesLedger")
-    public AjaxResult listPage(Page page, SalesLedgerProductDto salesLedgerProduct) {
+    public R<?> listPageSalesLedger(Page page, SalesLedgerProductDto salesLedgerProduct) {
         IPage<SalesLedgerProductDto> list = salesLedgerProductService.listPage(page,salesLedgerProduct);
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
 
 
@@ -56,9 +55,9 @@
      * 浠樻鐧昏鍒嗛〉鏌ヨ
      */
     @GetMapping("/listPagePurchaseLedger")
-    public AjaxResult listPagePurchaseLedger(Page page, SalesLedgerProductDto salesLedgerProduct) {
+    public R<?> listPagePurchaseLedger(Page page, SalesLedgerProductDto salesLedgerProduct) {
         IPage<SalesLedgerProductDto> list = salesLedgerProductService.listPagePurchaseLedger(page,salesLedgerProduct);
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
 
 
@@ -66,10 +65,10 @@
      * 鏌ヨ浜у搧淇℃伅鍒楄〃
      */
     @GetMapping("/list")
-    public AjaxResult list(SalesLedgerProduct salesLedgerProduct) {
+    public R<?> list(SalesLedgerProduct salesLedgerProduct) {
         List<SalesLedgerProduct> list = salesLedgerProductService.selectSalesLedgerProductList(salesLedgerProduct);
         if (CollUtil.isEmpty(list)) {
-            return AjaxResult.success(list);
+            return R.ok(list);
         }
         List<Long> productIds = list.stream().map(SalesLedgerProduct::getProductModelId).collect(Collectors.toList());
         List<SimpleReturnOrderGroupDto> groupListByProductIds = purchaseReturnOrderProductsMapper.getReturnOrderGroupListByProductIds(productIds);
@@ -94,7 +93,7 @@
             item.setReturnQuality(returnQuality);
             item.setAvailableQuality(item.getQuantity().subtract(returnQuality));
         });
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
 
     /**
@@ -113,9 +112,9 @@
      * 鑾峰彇浜у搧淇℃伅璇︾粏淇℃伅
      */
     @GetMapping(value = "/{id}")
-    public AjaxResult getInfo(@PathVariable("id") Long id)
+    public R<?> getInfo(@PathVariable("id") Long id)
     {
-        return success(salesLedgerProductService.selectSalesLedgerProductById(id));
+        return R.ok(salesLedgerProductService.selectSalesLedgerProductById(id));
     }
 
     /**
@@ -123,9 +122,10 @@
      */
     @Log(title = "浜у搧淇℃伅", businessType = BusinessType.INSERT)
     @PostMapping  ("/addOrUpdateSalesLedgerProduct")
-    public AjaxResult add(@RequestBody SalesLedgerProduct salesLedgerProduct)
+    public R<?> add(@RequestBody SalesLedgerProduct salesLedgerProduct)
     {
-        return toAjax(salesLedgerProductService.addOrUpdateSalesLedgerProduct(salesLedgerProduct));
+        salesLedgerProductService.addOrUpdateSalesLedgerProduct(salesLedgerProduct);
+        return R.ok();
     }
 
     /**
@@ -133,12 +133,13 @@
      */
     @Log(title = "浜у搧淇℃伅", businessType = BusinessType.DELETE)
 	@DeleteMapping("/delProduct")
-    public AjaxResult remove(@RequestBody Long[] ids)
+    public R<?> remove(@RequestBody Long[] ids)
     {
         if (ids == null || ids.length == 0) {
-            return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+            return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
         }
-        return toAjax(salesLedgerProductService.deleteSalesLedgerProductByIds(ids));
+        salesLedgerProductService.deleteSalesLedgerProductByIds(ids);
+        return R.ok();
     }
 
     //鏍规嵁浜у搧id鑾峰彇bom鍒ゆ柇搴撳瓨鏄惁鍏呰冻
diff --git a/src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java b/src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java
index f9251f8..a9d8f75 100644
--- a/src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java
+++ b/src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java
@@ -3,7 +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.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.sales.dto.SalesQuotationDto;
 import com.ruoyi.sales.service.SalesQuotationService;
 import jakarta.servlet.http.HttpServletResponse;
@@ -13,11 +14,11 @@
 @RestController
 @RequestMapping("/sales/quotation")
 @AllArgsConstructor
-public class SalesQuotationController {
+public class SalesQuotationController extends BaseController {
     private final SalesQuotationService salesQuotationService;
     @GetMapping("/list")
-    public AjaxResult getList(Page page, SalesQuotationDto salesQuotationDto) {
-        return AjaxResult.success(salesQuotationService.listPage(page, salesQuotationDto));
+    public R<?> getList(Page page, SalesQuotationDto salesQuotationDto) {
+        return R.ok(salesQuotationService.listPage(page, salesQuotationDto));
     }
 
 
@@ -32,15 +33,15 @@
 
 
     @PostMapping("/add")
-    public AjaxResult add(@RequestBody SalesQuotationDto salesQuotationDto) {
-        return AjaxResult.success(salesQuotationService.add(salesQuotationDto));
+    public R<?> add(@RequestBody SalesQuotationDto salesQuotationDto) {
+        return R.ok(salesQuotationService.add(salesQuotationDto));
     }
     @PostMapping("/update")
-    public AjaxResult update(@RequestBody SalesQuotationDto salesQuotationDto) {
-        return AjaxResult.success(salesQuotationService.edit(salesQuotationDto));
+    public R<?> update(@RequestBody SalesQuotationDto salesQuotationDto) {
+        return R.ok(salesQuotationService.edit(salesQuotationDto));
     }
     @DeleteMapping("/delete")
-    public AjaxResult delete(@RequestBody Long id) {
-        return AjaxResult.success(salesQuotationService.delete(id));
+    public R<?> delete(@RequestBody Long id) {
+        return R.ok(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..0ced35c 100644
--- a/src/main/java/com/ruoyi/sales/controller/SalespersonManagementController.java
+++ b/src/main/java/com/ruoyi/sales/controller/SalespersonManagementController.java
@@ -3,7 +3,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.sales.pojo.SalespersonManagement;
 import com.ruoyi.sales.service.SalespersonManagementService;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -28,36 +28,36 @@
 
     @GetMapping("/listPage")
     @Operation(summary = "鍒嗛〉鏌ヨ涓氬姟鍛樹俊鎭�")
-    public AjaxResult listPage(Page page, SalespersonManagement salespersonManagement) {
+    public R<?> listPage(Page page, SalespersonManagement salespersonManagement) {
         IPage<SalespersonManagement> listPage = salespersonManagementService.listPage(page, salespersonManagement);
-        return AjaxResult.success(listPage);
+        return R.ok(listPage);
     }
 
     @PostMapping("/add")
     @Operation(summary = "娣诲姞涓氬姟鍛樹俊鎭�")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult add(@RequestBody SalespersonManagement salespersonManagement) {
+    public R<?> add(@RequestBody SalespersonManagement salespersonManagement) {
         boolean save = salespersonManagementService.save(salespersonManagement);
-        return save ? AjaxResult.success() : AjaxResult.error();
+        return save ? R.ok() : R.fail();
     }
 
     @PostMapping("/update")
     @Operation(summary = "淇敼涓氬姟鍛樹俊鎭�")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult update(@RequestBody SalespersonManagement salespersonManagement) {
+    public R<?> update(@RequestBody SalespersonManagement salespersonManagement) {
         boolean update = salespersonManagementService.updateById(salespersonManagement);
-        return update ? AjaxResult.success() : AjaxResult.error();
+        return update ? R.ok() : R.fail();
     }
 
     @DeleteMapping("/delete")
     @Operation(summary = "鍒犻櫎涓氬姟鍛樹俊鎭�")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult delete(@RequestBody List<Long> ids) {
+    public R<?> delete(@RequestBody List<Long> ids) {
         if (ids == null || ids.isEmpty()) {
-            return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+            return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
         }
         boolean delete = salespersonManagementService.removeByIds(ids);
-        return delete ? AjaxResult.success() : AjaxResult.error();
+        return delete ? R.ok() : R.fail();
     }
 
 }
diff --git a/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java b/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
index f707b5b..9ca9b3a 100644
--- a/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
+++ b/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
@@ -11,7 +11,6 @@
 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;
 import com.ruoyi.sales.dto.ShippingInfoDto;
 import com.ruoyi.sales.mapper.ShippingInfoMapper;
@@ -45,16 +44,16 @@
 
     @GetMapping("/listPage")
     @Operation(summary = "鍙戣揣淇℃伅鍒楄〃")
-    public AjaxResult listPage(Page page, ShippingInfo req) {
+    public R<?> listPage(Page page, ShippingInfo req) {
         IPage<ShippingInfoDto> listPage = shippingInfoService.listPage(page,req);
-        return AjaxResult.success(listPage);
+        return R.ok(listPage);
     }
 
     @PostMapping("/add")
     @Operation(summary = "娣诲姞鍙戣揣淇℃伅")
     @Transactional(rollbackFor = Exception.class)
     @Log(title = "鍙戣揣淇℃伅绠$悊", businessType = BusinessType.INSERT)
-    public AjaxResult add(@RequestBody ShippingInfoDto req) throws Exception {
+    public R<?> add(@RequestBody ShippingInfoDto req) throws Exception {
         LoginUser loginUser = SecurityUtils.getLoginUser();
         String sh = OrderUtils.countTodayByCreateTime(shippingInfoMapper, "SH","shipping_no");
         // 鍙戣揣瀹℃壒
@@ -70,37 +69,37 @@
         req.setShippingNo(sh);
         req.setStatus("寰呭鏍�");
         boolean save = shippingInfoService.add(req);
-        return save ? AjaxResult.success() : AjaxResult.error();
+        return save ? R.ok() : R.fail();
     }
 
     @Operation(summary = "鍙戣揣鎵e簱瀛�")
     @PostMapping("/deductStock")
     @Transactional(rollbackFor = Exception.class)
     @Log(title = "鍙戣揣淇℃伅绠$悊", businessType = BusinessType.UPDATE)
-    public AjaxResult deductStock(@RequestBody ShippingInfoDto req) throws IOException {
-        return shippingInfoService.deductStock( req) ? AjaxResult.success() : AjaxResult.error();
+    public R<?> deductStock(@RequestBody ShippingInfoDto req) throws IOException {
+        return shippingInfoService.deductStock( req) ? R.ok() : R.fail();
     }
 
     @PostMapping("/update")
     @Operation(summary = "淇敼鍙戣揣淇℃伅")
     @Transactional(rollbackFor = Exception.class)
     @Log(title = "鍙戣揣淇℃伅绠$悊", businessType = BusinessType.UPDATE)
-    public AjaxResult update(@RequestBody ShippingInfo req) {
+    public R<?> update(@RequestBody ShippingInfo req) {
         ShippingInfo byId = shippingInfoService.getById(req.getId());
         if (byId == null) {
-            return AjaxResult.error("鍙戣揣淇℃伅涓嶅瓨鍦�");
+            return R.fail("鍙戣揣淇℃伅涓嶅瓨鍦�");
         }
         boolean update = shippingInfoService.updateById(req);
-        return update ? AjaxResult.success() : AjaxResult.error();
+        return update ? R.ok() : R.fail();
     }
 
     @DeleteMapping("/delete")
     @Operation(summary = "鍒犻櫎鍙戣揣淇℃伅")
     @Transactional(rollbackFor = Exception.class)
     @Log(title = "鍙戣揣淇℃伅绠$悊", businessType = BusinessType.DELETE)
-    public AjaxResult delete(@RequestBody List<Long> ids) {
+    public R<?> delete(@RequestBody List<Long> ids) {
 
-        return shippingInfoService.delete(ids) ? AjaxResult.success("鍒犻櫎鎴愬姛") : AjaxResult.error("鍒犻櫎澶辫触");
+        return shippingInfoService.delete(ids) ? R.ok("鍒犻櫎鎴愬姛") : R.fail("鍒犻櫎澶辫触");
     }
 
     /**
@@ -117,8 +116,8 @@
 
     @GetMapping("/getByCustomerName")
     @Operation(summary = "閫氳繃瀹㈡埛鍚嶇О鏌ヨ鍏宠仈鐨勫彂璐у崟鍙�")
-    public AjaxResult getByCustomerName(String customerName) {
-        return AjaxResult.success(shippingInfoService.getShippingInfoByCustomerName(customerName));
+    public R<?> getByCustomerName(String customerName) {
+        return R.ok(shippingInfoService.getShippingInfoByCustomerName(customerName));
     }
 
     @GetMapping("/getDateil/{id}")
diff --git a/src/main/java/com/ruoyi/sales/dto/SalesLedgerImportDto.java b/src/main/java/com/ruoyi/sales/dto/SalesLedgerImportDto.java
index 2430d10..0023e17 100644
--- a/src/main/java/com/ruoyi/sales/dto/SalesLedgerImportDto.java
+++ b/src/main/java/com/ruoyi/sales/dto/SalesLedgerImportDto.java
@@ -43,6 +43,10 @@
     @Excel(name = "绛捐鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
     private Date executionDate;
 
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "浜や粯鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date deliveryDate;
+
     @Schema(description = "浠樻鏂瑰紡")
     @Excel(name = "浠樻鏂瑰紡")
     private String paymentMethod;
diff --git a/src/main/java/com/ruoyi/sales/dto/SalesLedgerProductImportDto.java b/src/main/java/com/ruoyi/sales/dto/SalesLedgerProductImportDto.java
index 2c95909..9f05b60 100644
--- a/src/main/java/com/ruoyi/sales/dto/SalesLedgerProductImportDto.java
+++ b/src/main/java/com/ruoyi/sales/dto/SalesLedgerProductImportDto.java
@@ -73,6 +73,9 @@
     @Excel(name = "鏄惁璐ㄦ", readConverterExp = "0=鍚�,1=鏄�")
     private Boolean isChecked;
 
-
-
+    /**
+     * 鏄惁鐢熶骇
+     */
+    @Excel(name = "鏄惁鐢熶骇", readConverterExp = "0=鍚�,1=鏄�")
+    private Integer isProduction;
 }
diff --git a/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java b/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
index 539e67c..ecfed4a 100644
--- a/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
+++ b/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
@@ -5,7 +5,7 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.aftersalesservice.pojo.AfterSalesService;
 import com.ruoyi.common.enums.SaleEnum;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.sales.dto.LossProductModelDto;
 import com.ruoyi.sales.dto.MonthlyAmountDto;
 import com.ruoyi.sales.dto.SalesLedgerDto;
@@ -50,7 +50,7 @@
 
     IPage<SalesLedgerVo> selectSalesLedgerListPage(Page page, SalesLedgerDto salesLedgerDto);
 
-    AjaxResult importData(MultipartFile file);
+    R<?> importData(MultipartFile file);
 
     List<LossProductModelDto> getSalesLedgerWithProductsLoss(Long salesLedgerId);
 
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..22b9b66 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/MetricStatisticsServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/MetricStatisticsServiceImpl.java
@@ -2,7 +2,7 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.sales.dto.SalesTrendDto;
 import com.ruoyi.sales.dto.StatisticsTableDto;
 import com.ruoyi.sales.mapper.SalesLedgerMapper;
@@ -32,9 +32,9 @@
     private final SalesLedgerProductMapper salesLedgerProductMapper;
     private final ShippingInfoMapper shippingInfoMapper;
 
-    public AjaxResult total() {
+    public R<?> total() {
         List<SalesLedger> salesLedgers = salesLedgerMapper.selectList(null);
-        if(CollectionUtils.isEmpty(salesLedgers)) return AjaxResult.success(salesLedgers);
+        if(CollectionUtils.isEmpty(salesLedgers)) return R.ok(salesLedgers);
         Map<String, Object> map = new HashMap<>();
         // 閿�鍞
         map.put("contractAmountTotal", salesLedgers.stream().map(SalesLedger::getContractAmount).reduce(BigDecimal.ZERO, BigDecimal::add));
@@ -44,16 +44,16 @@
         List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>()
                 .eq(SalesLedgerProduct::getType, 1));
         map.put("shipRate", "0%");
-        if(CollectionUtils.isEmpty(salesLedgerProducts)) return AjaxResult.success(map);
+        if(CollectionUtils.isEmpty(salesLedgerProducts)) return R.ok(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()) + "%");
-        return AjaxResult.success(map);
+        return R.ok(map);
     }
 
-    public AjaxResult statisticsTable(StatisticsTableDto statisticsTableDto) {
+    public R<?> statisticsTable(StatisticsTableDto statisticsTableDto) {
         Map<String, Object> map = new HashMap<>();
         Calendar calendar = Calendar.getInstance();
 
@@ -123,6 +123,6 @@
         map.put("orderCountList", orderCountList);
         map.put("salesAmountList", salesAmountList);
         map.put("shippingRateList", shippingRateList);
-        return AjaxResult.success(map);
+        return R.ok(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 8ce023b..a827cb8 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -285,6 +285,9 @@
      * 鍒犻櫎鐢熶骇璁″垝
      */
     public void deleteProductionData(List<Long> productIds) {
+        if (CollectionUtils.isEmpty(productIds)) {
+            return;
+        }
         List<ProductionPlan> productionPlans = productionPlanMapper.selectList(
                 new LambdaQueryWrapper<ProductionPlan>()
                         .in(ProductionPlan::getSalesLedgerProductId, productIds.stream().map(Long::intValue).collect(Collectors.toList())));
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 a2f918b..9d8cfae 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -1,6 +1,7 @@
 package com.ruoyi.sales.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
@@ -25,10 +26,11 @@
 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.other.pojo.TempFile;
-import com.ruoyi.production.mapper.*;
+import com.ruoyi.production.mapper.ProductionProductInputMapper;
+import com.ruoyi.production.mapper.ProductionProductMainMapper;
+import com.ruoyi.production.mapper.ProductionProductOutputMapper;
 import com.ruoyi.production.service.ProductionProductMainService;
 import com.ruoyi.project.system.domain.SysDept;
 import com.ruoyi.project.system.domain.SysUser;
@@ -44,7 +46,6 @@
 import com.ruoyi.sales.vo.SalesLedgerVo;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.io.FilenameUtils;
 import org.jetbrains.annotations.Nullable;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -55,15 +56,10 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.Field;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.StandardCopyOption;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.YearMonth;
@@ -335,21 +331,29 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult importData(MultipartFile file) {
+    public R<?> importData(MultipartFile file) {
         LoginUser loginUser = SecurityUtils.getLoginUser();
         try {
             InputStream inputStream = file.getInputStream();
             ExcelUtil<SalesLedgerImportDto> salesLedgerImportDtoExcelUtil = new ExcelUtil<>(SalesLedgerImportDto.class);
             Map<String, List<SalesLedgerImportDto>> stringListMap = salesLedgerImportDtoExcelUtil.importExcelMultiSheet(Arrays.asList("閿�鍞彴璐︽暟鎹�", "閿�鍞骇鍝佹暟鎹�"), inputStream, 0);
-            if (CollectionUtils.isEmpty(stringListMap)) return AjaxResult.error("閿�鍞〃鏍间负绌猴紒");
+            if (CollectionUtils.isEmpty(stringListMap)) return R.fail("閿�鍞〃鏍间负绌猴紒");
             // 涓氬姟灞傚悎骞�
             List<SalesLedgerImportDto> salesLedgerImportDtoList = stringListMap.get("閿�鍞彴璐︽暟鎹�");
-            if (CollectionUtils.isEmpty(salesLedgerImportDtoList)) return AjaxResult.error("閿�鍞彴璐︽暟鎹负绌猴紒");
+            if (CollectionUtils.isEmpty(salesLedgerImportDtoList)) return R.fail("閿�鍞彴璐︽暟鎹负绌猴紒");
             List<SalesLedgerImportDto> salesLedgerProductImportDtoList = stringListMap.get("閿�鍞骇鍝佹暟鎹�");
-            if (CollectionUtils.isEmpty(salesLedgerProductImportDtoList)) return AjaxResult.error("閿�鍞骇鍝佹暟鎹负绌猴紒");
-            // 瀹㈡埛鏁版嵁
-            List<Customer> customers = customerMapper.selectList(new LambdaQueryWrapper<Customer>().in(Customer::getCustomerName,
-                    salesLedgerImportDtoList.stream().map(SalesLedgerImportDto::getCustomerName).collect(Collectors.toList())));
+            if (CollectionUtils.isEmpty(salesLedgerProductImportDtoList)) return R.fail("閿�鍞骇鍝佹暟鎹负绌猴紒");
+            // 瀹㈡埛鏁版嵁 - 鍙傝�� 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<ProductModel> productModels = productModelMapper.selectList(new LambdaQueryWrapper<ProductModel>().in(ProductModel::getModel,
 //                    salesLedgerProductImportDtoList.stream().map(SalesLedgerImportDto::getSpecificationModel).collect(Collectors.toList())));
@@ -370,17 +374,16 @@
                 SalesLedger salesLedger = new SalesLedger();
                 BeanUtils.copyProperties(salesLedgerImportDto, salesLedger);
                 salesLedger.setExecutionDate(DateUtils.toLocalDate(salesLedgerImportDto.getExecutionDate()));
+                salesLedger.setDeliveryDate(DateUtils.toLocalDate(salesLedgerImportDto.getDeliveryDate()));
                 // 閫氳繃瀹㈡埛鍚嶇О鏌ヨ瀹㈡埛ID锛屽鎴峰悎鍚屽彿
-                salesLedger.setCustomerId(customers.stream()
+                Optional<Customer> customerOptional = customers.stream()
                         .filter(customer -> customer.getCustomerName().equals(salesLedger.getCustomerName()))
-                        .findFirst()
-                        .map(Customer::getId)
-                        .orElse(null));
-                salesLedger.setCustomerContractNo(customers.stream()
-                        .filter(customer -> customer.getCustomerName().equals(salesLedger.getCustomerName()))
-                        .findFirst()
-                        .map(Customer::getTaxpayerIdentificationNumber)
-                        .orElse(null));
+                        .findFirst();
+                if (customerOptional.isEmpty()) {
+                    throw new RuntimeException("瀹㈡埛:" + salesLedger.getCustomerName() + "涓嶅瓨鍦紒鎴栬�呴潪绉佹捣鐢ㄦ埛");
+                }
+                salesLedger.setCustomerId(customerOptional.get().getId());
+                salesLedger.setCustomerContractNo(customerOptional.get().getTaxpayerIdentificationNumber());
                 Long aLong = sysUsers.stream()
                         .filter(sysUser -> sysUser.getNickName().equals(salesLedger.getEntryPerson()))
                         .findFirst()
@@ -410,13 +413,16 @@
                     salesLedgerProduct.setTaxExclusiveTotalPrice(salesLedgerProduct.getTaxInclusiveTotalPrice().divide(new BigDecimal(1).add(salesLedgerProduct.getTaxRate().divide(new BigDecimal(100))), 2, RoundingMode.HALF_UP));
                     salesLedgerProduct.setNoInvoiceNum(salesLedgerProduct.getQuantity());
                     salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxExclusiveTotalPrice());
-                    list.stream()
-                            .filter(map -> map.get("productName").equals(salesLedgerProduct.getProductCategory()) && map.get("model").equals(salesLedgerProduct.getSpecificationModel()))
-                            .findFirst()
-                            .ifPresent(map -> {
-                                salesLedgerProduct.setProductModelId(Long.parseLong(map.get("modelId").toString()));
-                                salesLedgerProduct.setProductId(Long.parseLong(map.get("id").toString()));
-                            });
+                    // 鏍¢獙浜у搧瑙勬牸鏄惁瀛樺湪
+                    Optional<Map<String, Object>> productModelOptional = 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()));
 //                    salesLedgerProduct.setProductId(productList.stream()
 //                            .filter(product -> product.getProductName().equals(salesLedgerProduct.getProductCategory()))
 //                            .findFirst()
@@ -431,17 +437,18 @@
                     salesLedgerProduct.setRegisterDate(LocalDateTime.now());
                     salesLedgerProduct.setApproveStatus(0);
                     salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProductImportDto.getTaxInclusiveTotalPrice());
+                    salesLedgerProduct.setIsProduction(salesLedgerProductImportDto.getIsProduction() == 1);
                     salesLedgerProductMapper.insert(salesLedgerProduct);
                     // 娣诲姞鐢熶骇鏁版嵁
                     salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct);
                 }
             }
 
-            return AjaxResult.success("瀵煎叆鎴愬姛");
+            return R.ok(null, "瀵煎叆鎴愬姛");
         } catch (Exception e) {
             e.printStackTrace();
+            return R.fail("瀵煎叆澶辫触锛�" + e.getMessage());
         }
-        return AjaxResult.success("瀵煎叆澶辫触");
     }
 
     @Override
@@ -599,7 +606,10 @@
         salesLedger.setTenantId(customer.getTenantId());
         // 3. 鏂板鎴栨洿鏂颁富琛�
         if (salesLedger.getId() == null) {
-            String contractNo = generateSalesContractNo();
+            String contractNo = salesLedger.getSalesContractNo();
+            if (StringUtils.isEmpty(contractNo)) {
+                contractNo = generateSalesContractNo();
+            }
             salesLedger.setSalesContractNo(contractNo);
             salesLedgerMapper.insert(salesLedger);
         } else {
diff --git a/src/main/java/com/ruoyi/staff/controller/AnalyticsController.java b/src/main/java/com/ruoyi/staff/controller/AnalyticsController.java
index 2522550..3a23ce7 100644
--- a/src/main/java/com/ruoyi/staff/controller/AnalyticsController.java
+++ b/src/main/java/com/ruoyi/staff/controller/AnalyticsController.java
@@ -1,6 +1,7 @@
 package com.ruoyi.staff.controller;
 
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.staff.service.AnalyticsService;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -10,23 +11,23 @@
 
 @RestController
 @RequestMapping("/staff/analytics")
-public class AnalyticsController {
+public class AnalyticsController extends BaseController {
 
     @Resource
     private AnalyticsService analyticsService;
 
     @GetMapping("/reason")
-    public AjaxResult staffLeaveReasonAnalytics() {
-        return AjaxResult.success(analyticsService.staffLeaveReasonAnalytics());
+    public R<?> staffLeaveReasonAnalytics() {
+        return R.ok(analyticsService.staffLeaveReasonAnalytics());
     }
 
     @GetMapping("/monthly_turnover_rate")
-    public AjaxResult getMonthlyTurnoverRateFor12Months() {
-        return AjaxResult.success(analyticsService.getMonthlyTurnoverRateFor12Months());
+    public R<?> getMonthlyTurnoverRateFor12Months() {
+        return R.ok(analyticsService.getMonthlyTurnoverRateFor12Months());
     }
 
     @GetMapping("/total_statistic")
-    public AjaxResult getTotalStatistic() {
-        return AjaxResult.success(analyticsService.getTotalStatistic());
+    public R<?> getTotalStatistic() {
+        return R.ok(analyticsService.getTotalStatistic());
     }
 }
diff --git a/src/main/java/com/ruoyi/staff/controller/BankController.java b/src/main/java/com/ruoyi/staff/controller/BankController.java
index 1e9aa1f..372998e 100644
--- a/src/main/java/com/ruoyi/staff/controller/BankController.java
+++ b/src/main/java/com/ruoyi/staff/controller/BankController.java
@@ -2,7 +2,8 @@
 
 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.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.staff.pojo.Bank;
 import com.ruoyi.staff.service.BankService;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -25,37 +26,37 @@
 @RestController
 @RequestMapping("/bank")
 @AllArgsConstructor
-public class BankController {
+public class BankController extends BaseController {
 
     private BankService bankService;
 
     @GetMapping("/list")
-    public AjaxResult list() {
-        return AjaxResult.success(bankService.list());
+    public R<?> list() {
+        return R.ok(bankService.list());
     }
 
     @PostMapping("/add")
     @Operation(summary = "鏂板閾惰绠$悊琛�")
     @Transactional(rollbackFor = Exception.class)
     @Log(title = "閾惰绠$悊琛�", businessType = BusinessType.INSERT)
-    public AjaxResult add(@RequestBody Bank bank) {
-        return AjaxResult.success(bankService.save(bank));
+    public R<?> add(@RequestBody Bank bank) {
+        return R.ok(bankService.save(bank));
     }
 
     @PostMapping("/update")
     @Operation(summary = "鏇存柊閾惰绠$悊琛�")
     @Transactional(rollbackFor = Exception.class)
     @Log(title = "閾惰绠$悊琛�", businessType = BusinessType.UPDATE)
-    public AjaxResult update(@RequestBody Bank bank) {
-        return AjaxResult.success(bankService.updateById(bank));
+    public R<?> update(@RequestBody Bank bank) {
+        return R.ok(bankService.updateById(bank));
     }
 
     @DeleteMapping("/delete")
     @Operation(summary = "鍒犻櫎閾惰绠$悊琛�")
     @Transactional(rollbackFor = Exception.class)
     @Log(title = "閾惰绠$悊琛�", businessType = BusinessType.DELETE)
-    public AjaxResult delete(@RequestBody List<Long> ids) {
-        return AjaxResult.success(bankService.removeBatchByIds(ids));
+    public R<?> delete(@RequestBody List<Long> ids) {
+        return R.ok(bankService.removeBatchByIds(ids));
     }
 
 }
diff --git a/src/main/java/com/ruoyi/staff/controller/HolidayApplicationController.java b/src/main/java/com/ruoyi/staff/controller/HolidayApplicationController.java
index 6498ef9..62d430c 100644
--- a/src/main/java/com/ruoyi/staff/controller/HolidayApplicationController.java
+++ b/src/main/java/com/ruoyi/staff/controller/HolidayApplicationController.java
@@ -1,7 +1,8 @@
 package com.ruoyi.staff.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.staff.pojo.HolidayApplication;
 import com.ruoyi.staff.service.HolidayApplicationService;
 import lombok.AllArgsConstructor;
@@ -10,35 +11,35 @@
 @RestController
 @RequestMapping("/staff/holidayApplication")
 @AllArgsConstructor
-public class HolidayApplicationController {
+public class HolidayApplicationController extends BaseController {
 
     private HolidayApplicationService holidayApplicationService;
     /**
      * 璇峰亣鐢宠鍒嗛〉鏌ヨ
      */
     @GetMapping("/listPage")
-    public AjaxResult listPage(Page page, HolidayApplication holidayApplication){
-        return AjaxResult.success(holidayApplicationService.listPage(page, holidayApplication));
+    public R<?> listPage(Page page, HolidayApplication holidayApplication){
+        return R.ok(holidayApplicationService.listPage(page, holidayApplication));
     }
     /**
      * 鏂板璇峰亣鐢宠
      */
     @PostMapping("/add")
-    public AjaxResult add(@RequestBody HolidayApplication holidayApplication){
-        return AjaxResult.success(holidayApplicationService.save(holidayApplication));
+    public R<?> add(@RequestBody HolidayApplication holidayApplication){
+        return R.ok(holidayApplicationService.save(holidayApplication));
     }
     /**
      * 淇敼璇峰亣鐢宠
      */
     @PostMapping("/update")
-    public AjaxResult update(@RequestBody HolidayApplication holidayApplication){
-        return AjaxResult.success(holidayApplicationService.updateById(holidayApplication));
+    public R<?> update(@RequestBody HolidayApplication holidayApplication){
+        return R.ok(holidayApplicationService.updateById(holidayApplication));
     }
     /**
      * 鍒犻櫎璇峰亣鐢宠
      */
     @DeleteMapping("/delete/{id}")
-    public AjaxResult delete(@PathVariable("id") Long id){
-        return AjaxResult.success(holidayApplicationService.removeById(id));
+    public R<?> delete(@PathVariable("id") Long id){
+        return R.ok(holidayApplicationService.removeById(id));
     }
 }
diff --git a/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java b/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java
index 37902fa..95f3105 100644
--- a/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java
+++ b/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java
@@ -1,7 +1,8 @@
 package com.ruoyi.staff.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.staff.dto.PersonalAttendanceRecordsDto;
 import com.ruoyi.staff.pojo.PersonalAttendanceRecords;
 import com.ruoyi.staff.service.PersonalAttendanceRecordsService;
@@ -23,26 +24,26 @@
 @RestController
 @RequestMapping("/personalAttendanceRecords")
 @Tag(name = "浜哄憳鎵撳崱绛惧埌")
-public class PersonalAttendanceRecordsController {
+public class PersonalAttendanceRecordsController extends BaseController {
     @Resource
     private PersonalAttendanceRecordsService personalAttendanceRecordsService;
 
     @Operation(summary = "鏂板鎵撳崱绛惧埌")
     @PostMapping("")
-    public AjaxResult add(@RequestBody PersonalAttendanceRecordsDto personalAttendanceRecordsDto){
-        return AjaxResult.success(personalAttendanceRecordsService.add(personalAttendanceRecordsDto));
+    public R<?> add(@RequestBody PersonalAttendanceRecordsDto personalAttendanceRecordsDto){
+        return R.ok(personalAttendanceRecordsService.add(personalAttendanceRecordsDto));
     }
 
     @Operation(summary = "鍒嗛〉鏌ヨ鎵撳崱绛惧埌")
     @GetMapping("/listPage")
-    public AjaxResult listPage(Page page, PersonalAttendanceRecordsDto personalAttendanceRecordsDto){
-        return AjaxResult.success(personalAttendanceRecordsService.listPage(page, personalAttendanceRecordsDto));
+    public R<?> listPage(Page page, PersonalAttendanceRecordsDto personalAttendanceRecordsDto){
+        return R.ok(personalAttendanceRecordsService.listPage(page, personalAttendanceRecordsDto));
     }
 
     @Operation(summary = "鑾峰彇褰撳墠浜虹殑鑰冨嫟鐩稿叧鏁版嵁")
     @GetMapping("/today")
-    public AjaxResult todayInfo(PersonalAttendanceRecordsDto personalAttendanceRecordsDto){
-        return AjaxResult.success(personalAttendanceRecordsService.todayInfo(personalAttendanceRecordsDto));
+    public R<?> todayInfo(PersonalAttendanceRecordsDto personalAttendanceRecordsDto){
+        return R.ok(personalAttendanceRecordsService.todayInfo(personalAttendanceRecordsDto));
     }
 
     @Operation(summary = "瀵煎嚭鎵撳崱绛惧埌")
diff --git a/src/main/java/com/ruoyi/staff/controller/SchemeApplicableStaffController.java b/src/main/java/com/ruoyi/staff/controller/SchemeApplicableStaffController.java
index fd97213..4abb319 100644
--- a/src/main/java/com/ruoyi/staff/controller/SchemeApplicableStaffController.java
+++ b/src/main/java/com/ruoyi/staff/controller/SchemeApplicableStaffController.java
@@ -4,7 +4,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.staff.pojo.SchemeApplicableStaff;
 import com.ruoyi.staff.service.SchemeApplicableStaffService;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -34,7 +34,7 @@
 
     @GetMapping("/listPage")
     @Operation(summary = "鍒嗛〉鏌ヨ")
-    public AjaxResult listPage(Page page, SchemeApplicableStaff schemeApplicableStaff) {
+    public R<?> listPage(Page page, SchemeApplicableStaff schemeApplicableStaff) {
         return schemeApplicableStaffService.listPage(page,schemeApplicableStaff);
     }
 
@@ -42,7 +42,7 @@
     @Operation(summary = "娣诲姞")
     @Transactional(rollbackFor = Exception.class)
     @Log(title = "绀句繚鏂规閫傜敤浜哄憳琛�", businessType = BusinessType.INSERT)
-    public AjaxResult add(@RequestBody SchemeApplicableStaff schemeApplicableStaff) {
+    public R<?> add(@RequestBody SchemeApplicableStaff schemeApplicableStaff) {
         return schemeApplicableStaffService.add(schemeApplicableStaff);
     }
 
@@ -50,7 +50,7 @@
     @Operation(summary = "淇敼")
     @Transactional(rollbackFor = Exception.class)
     @Log(title = "绀句繚鏂规閫傜敤浜哄憳琛�", businessType = BusinessType.UPDATE)
-    public AjaxResult updateSchemeApplicableStaff(@RequestBody SchemeApplicableStaff schemeApplicableStaff) {
+    public R<?> updateSchemeApplicableStaff(@RequestBody SchemeApplicableStaff schemeApplicableStaff) {
         return schemeApplicableStaffService.updateSchemeApplicableStaff(schemeApplicableStaff);
     }
 
@@ -58,7 +58,7 @@
     @Operation(summary = "鍒犻櫎")
     @Transactional(rollbackFor = Exception.class)
     @Log(title = "绀句繚鏂规閫傜敤浜哄憳琛�", businessType = BusinessType.DELETE)
-    public AjaxResult delete(@RequestBody List<Long> ids) {
+    public R<?> delete(@RequestBody List<Long> ids) {
         return schemeApplicableStaffService.delete(ids);
     }
 
diff --git a/src/main/java/com/ruoyi/staff/controller/StaffContractController.java b/src/main/java/com/ruoyi/staff/controller/StaffContractController.java
index 17cdaf6..59908ba 100644
--- a/src/main/java/com/ruoyi/staff/controller/StaffContractController.java
+++ b/src/main/java/com/ruoyi/staff/controller/StaffContractController.java
@@ -1,7 +1,8 @@
 package com.ruoyi.staff.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.staff.pojo.StaffContract;
 import com.ruoyi.staff.service.StaffContractService;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -15,7 +16,7 @@
 @RestController
 @RequestMapping("/staff/staffContract")
 @Tag(name = "鍛樺伐鍙拌处/鍚堝悓绠$悊")
-public class StaffContractController {
+public class StaffContractController extends BaseController {
 
     @Resource
     private StaffContractService staffContractService;
@@ -28,7 +29,7 @@
      * @return
      */
     @GetMapping("/listPage")
-    public AjaxResult staffContractListPage(Page page, StaffContract staffContract) {
-        return AjaxResult.success(staffContractService.staffContractListPage(page, staffContract));
+    public R<?> staffContractListPage(Page page, StaffContract staffContract) {
+        return R.ok(staffContractService.staffContractListPage(page, staffContract));
     }
 }
diff --git a/src/main/java/com/ruoyi/staff/controller/StaffLeaveController.java b/src/main/java/com/ruoyi/staff/controller/StaffLeaveController.java
index 64a35d9..585a249 100644
--- a/src/main/java/com/ruoyi/staff/controller/StaffLeaveController.java
+++ b/src/main/java/com/ruoyi/staff/controller/StaffLeaveController.java
@@ -1,7 +1,8 @@
 package com.ruoyi.staff.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.staff.dto.StaffLeaveDto;
 import com.ruoyi.staff.service.StaffLeaveService;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -18,7 +19,7 @@
 @RestController
 @RequestMapping("/staff/staffLeave")
 @Tag(name = "鍛樺伐绂昏亴")
-public class StaffLeaveController {
+public class StaffLeaveController extends BaseController {
     @Resource
     private StaffLeaveService staffLeaveService;
     /**
@@ -28,8 +29,8 @@
      * @return
      */
     @GetMapping("/listPage")
-    public AjaxResult staffLeaveListPage(Page page, StaffLeaveDto staffLeaveDto) {
-        return AjaxResult.success(staffLeaveService.staffLeaveListPage(page, staffLeaveDto));
+    public R<?> staffLeaveListPage(Page page, StaffLeaveDto staffLeaveDto) {
+        return R.ok(staffLeaveService.staffLeaveListPage(page, staffLeaveDto));
     }
 
     /**
@@ -38,8 +39,8 @@
      * @return
      */
     @PostMapping("")
-    public AjaxResult add(@RequestBody StaffLeaveDto staffLeaveDto) {
-        return AjaxResult.success(staffLeaveService.add(staffLeaveDto));
+    public R<?> add(@RequestBody StaffLeaveDto staffLeaveDto) {
+        return R.ok(staffLeaveService.add(staffLeaveDto));
     }
 
     /**
@@ -49,8 +50,8 @@
      * @return
      */
     @PutMapping("/{id}")
-    public AjaxResult update(@PathVariable("id") Long id, @RequestBody StaffLeaveDto staffLeaveDto) {
-        return AjaxResult.success(staffLeaveService.update(id, staffLeaveDto));
+    public R<?> update(@PathVariable("id") Long id, @RequestBody StaffLeaveDto staffLeaveDto) {
+        return R.ok(staffLeaveService.update(id, staffLeaveDto));
     }
 
     /**
@@ -59,11 +60,11 @@
      * @return
      */
     @DeleteMapping("/del")
-    public AjaxResult del(@RequestBody List<Integer> ids) {
+    public R<?> del(@RequestBody List<Integer> ids) {
         if(CollectionUtils.isEmpty(ids)){
-            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+            return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         }
-        return AjaxResult.success(staffLeaveService.del(ids));
+        return R.ok(staffLeaveService.del(ids));
     }
 
     /**
diff --git a/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java b/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
index ab27019..2bb6cd7 100644
--- a/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
+++ b/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
@@ -4,7 +4,8 @@
 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.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.staff.dto.StaffOnJobDto;
 import com.ruoyi.staff.dto.StaffOnJobExcelDto;
 import com.ruoyi.staff.pojo.StaffContract;
@@ -26,7 +27,7 @@
 @RestController
 @RequestMapping("/staff/staffOnJob")
 @Tag(name = "鍛樺伐鍙拌处")
-public class StaffOnJobController {
+public class StaffOnJobController extends BaseController {
 
     @Resource
     private IStaffOnJobService staffOnJobService;
@@ -39,8 +40,8 @@
      * @return
      */
     @GetMapping("/listPage")
-    public AjaxResult staffOnJobListPage(Page page, StaffOnJob staffOnJob) {
-        return AjaxResult.success(staffOnJobService.staffOnJobListPage(page, staffOnJob));
+    public R<?> staffOnJobListPage(Page page, StaffOnJob staffOnJob) {
+        return R.ok(staffOnJobService.staffOnJobListPage(page, staffOnJob));
     }
 
     /**
@@ -48,8 +49,8 @@
      * @return
      */
     @GetMapping("/list")
-    public AjaxResult staffOnJobList(StaffOnJob staffOnJob) {
-        return AjaxResult.success(staffOnJobService.staffOnJobList(staffOnJob));
+    public R<?> staffOnJobList(StaffOnJob staffOnJob) {
+        return R.ok(staffOnJobService.staffOnJobList(staffOnJob));
     }
 
     /**
@@ -58,8 +59,8 @@
      * @return
      */
     @PostMapping("")
-    public AjaxResult add(@RequestBody StaffOnJobDto staffOnJob) {
-        return AjaxResult.success(staffOnJobService.add(staffOnJob));
+    public R<?> add(@RequestBody StaffOnJobDto staffOnJob) {
+        return R.ok(staffOnJobService.add(staffOnJob));
     }
 
     /**
@@ -68,8 +69,8 @@
      * @return
      */
     @PutMapping("/{id}")
-    public AjaxResult update(@PathVariable("id") Long id, @RequestBody StaffOnJobDto staffOnJobDto) {
-        return AjaxResult.success(staffOnJobService.update(id, staffOnJobDto));
+    public R<?> update(@PathVariable("id") Long id, @RequestBody StaffOnJobDto staffOnJobDto) {
+        return R.ok(staffOnJobService.update(id, staffOnJobDto));
     }
 
     /**
@@ -78,11 +79,11 @@
      * @return
      */
     @DeleteMapping("/del")
-    public AjaxResult delStaffOnJobs(@RequestBody List<Integer> ids) {
+    public R<?> delStaffOnJobs(@RequestBody List<Integer> ids) {
         if(CollectionUtils.isEmpty(ids)){
-            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+            return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         }
-        return AjaxResult.success(staffOnJobService.delStaffOnJobs(ids));
+        return R.ok(staffOnJobService.delStaffOnJobs(ids));
     }
 
     /**
@@ -91,8 +92,8 @@
      * @return
      */
     @GetMapping("/{id}")
-    public AjaxResult staffOnJobDetail(@PathVariable("id") Long id) {
-        return AjaxResult.success(staffOnJobService.staffOnJobDetail(id));
+    public R<?> staffOnJobDetail(@PathVariable("id") Long id) {
+        return R.ok(staffOnJobService.staffOnJobDetail(id));
     }
 
     /**
@@ -102,8 +103,8 @@
      * @return
      */
     @PostMapping("/renewContract/{id}")
-    public AjaxResult renewContract(@PathVariable Long id, @RequestBody StaffContract staffContract) {
-        return AjaxResult.success(staffOnJobService.renewContract(id, staffContract));
+    public R<?> renewContract(@PathVariable Long id, @RequestBody StaffContract staffContract) {
+        return R.ok(staffOnJobService.renewContract(id, staffContract));
     }
 
     @Operation(summary = "涓嬭浇妯℃澘")
@@ -118,12 +119,12 @@
      */
     @PostMapping("/import")
     @Log(title = "鍦ㄨ亴鍛樺伐瀵煎叆", businessType = BusinessType.IMPORT)
-    public AjaxResult importData(@RequestPart("file") MultipartFile file) {
+    public R<?> importData(@RequestPart("file") MultipartFile file) {
         Boolean b = staffOnJobService.importData(file);
         if (b) {
-            return AjaxResult.success("瀵煎叆鎴愬姛");
+            return R.ok(null, "瀵煎叆鎴愬姛");
         }
-        return AjaxResult.error("瀵煎叆澶辫触");
+        return R.fail("瀵煎叆澶辫触");
     }
 
     /**
@@ -143,8 +144,8 @@
      */
     @PostMapping("/exportCopy")
     @Operation(summary = "word妯℃澘鍚堝悓鍦ㄨ亴鍛樺伐瀵煎嚭")
-    public AjaxResult exportCopy(HttpServletResponse response,@RequestBody StaffOnJob staffOnJob) throws Exception{
-       return AjaxResult.success(staffOnJobService.exportCopy(response, staffOnJob));
+    public R<?> exportCopy(HttpServletResponse response,@RequestBody StaffOnJob staffOnJob) throws Exception{
+       return R.ok(staffOnJobService.exportCopy(response, staffOnJob));
     }
 
 
diff --git a/src/main/java/com/ruoyi/staff/controller/StaffSalaryMainController.java b/src/main/java/com/ruoyi/staff/controller/StaffSalaryMainController.java
index 569ca1c..dfc0d67 100644
--- a/src/main/java/com/ruoyi/staff/controller/StaffSalaryMainController.java
+++ b/src/main/java/com/ruoyi/staff/controller/StaffSalaryMainController.java
@@ -3,7 +3,8 @@
 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.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.staff.dto.CalculateSalaryDto;
 import com.ruoyi.staff.pojo.StaffSalaryMain;
 import com.ruoyi.staff.service.StaffSalaryMainService;
@@ -27,19 +28,19 @@
 @RestController
 @RequestMapping("/staffSalaryMain")
 @AllArgsConstructor
-public class StaffSalaryMainController {
+public class StaffSalaryMainController extends BaseController {
 
     private StaffSalaryMainService staffSalaryMainService;
 
     @GetMapping("/listPage")
     @Operation(summary = "鍛樺伐宸ヨ祫涓昏〃鍒嗛〉鏌ヨ")
-    public AjaxResult listPage(Page page, StaffSalaryMain staffSalaryMain) {
+    public R<?> listPage(Page page, StaffSalaryMain staffSalaryMain) {
         return staffSalaryMainService.listPage(page, staffSalaryMain);
     }
 
     @Operation(summary = "閫氳繃閮ㄩ棬ids鑾峰彇鐢ㄦ埛淇℃伅璁$畻姣忎釜鍛樺伐鐨勫伐璧�")
     @PostMapping("/calculateSalary")
-    public AjaxResult calculateSalary(@RequestBody CalculateSalaryDto calculateSalaryDto) {
+    public R<?> calculateSalary(@RequestBody CalculateSalaryDto calculateSalaryDto) {
         return staffSalaryMainService.calculateSalary(calculateSalaryDto);
     }
 
@@ -47,7 +48,7 @@
     @Operation(summary = "鏂板缓宸ヨ祫琛�")
     @Log(title = "鏂板缓宸ヨ祫琛�", businessType = BusinessType.INSERT)
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult add(@RequestBody StaffSalaryMain staffSalaryMain) {
+    public R<?> add(@RequestBody StaffSalaryMain staffSalaryMain) {
         return staffSalaryMainService.add(staffSalaryMain);
     }
 
@@ -55,7 +56,7 @@
     @Operation(summary = "淇敼宸ヨ祫琛�")
     @Log(title = "淇敼宸ヨ祫琛�", businessType = BusinessType.UPDATE)
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult updateStaffSalaryMain(@RequestBody StaffSalaryMain staffSalaryMain) {
+    public R<?> updateStaffSalaryMain(@RequestBody StaffSalaryMain staffSalaryMain) {
         return staffSalaryMainService.updateStaffSalaryMain(staffSalaryMain);
     }
 
@@ -63,7 +64,7 @@
     @Operation(summary = "鍒犻櫎宸ヨ祫琛�")
     @Log(title = "鍒犻櫎宸ヨ祫琛�", businessType = BusinessType.DELETE)
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult delete(@RequestBody List<Long> ids) {
+    public R<?> delete(@RequestBody List<Long> ids) {
         return staffSalaryMainService.delete(ids);
     }
 
diff --git a/src/main/java/com/ruoyi/staff/controller/StaffSchedulingController.java b/src/main/java/com/ruoyi/staff/controller/StaffSchedulingController.java
index d195e9c..a49809a 100644
--- a/src/main/java/com/ruoyi/staff/controller/StaffSchedulingController.java
+++ b/src/main/java/com/ruoyi/staff/controller/StaffSchedulingController.java
@@ -5,7 +5,8 @@
 import com.ruoyi.compensationperformance.pojo.CompensationPerformance;
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.staff.dto.SaveStaffSchedulingDto;
 import com.ruoyi.staff.dto.StaffSchedulingDto;
 import com.ruoyi.staff.service.StaffSchedulingService;
@@ -26,39 +27,39 @@
 @RestController
 @RequestMapping("/staff/staffScheduling")
 @RequiredArgsConstructor
-public class StaffSchedulingController {
+public class StaffSchedulingController extends BaseController {
 
     private final StaffSchedulingService staffSchedulingService;
 
     @PostMapping("/listPage")
-    public AjaxResult listPage(@RequestBody SearchSchedulingVo vo){
-       return AjaxResult.success(staffSchedulingService.listPage(vo));
+    public R<?> listPage(@RequestBody SearchSchedulingVo vo){
+       return R.ok(staffSchedulingService.listPage(vo));
     }
 
     @PostMapping("/save")
-    public AjaxResult save(@RequestBody @Validated SaveStaffSchedulingDto saveStaffSchedulingDto){
+    public R<?> save(@RequestBody @Validated SaveStaffSchedulingDto saveStaffSchedulingDto){
         staffSchedulingService.saveStaffScheduling(saveStaffSchedulingDto);
-        return AjaxResult.success();
+        return R.ok();
     }
 
     @DeleteMapping("/delByIds")
-    public AjaxResult delByIds(@RequestBody List<Integer> ids){
+    public R<?> delByIds(@RequestBody List<Integer> ids){
         staffSchedulingService.removeByIds(ids);
-        return AjaxResult.success();
+        return R.ok();
     }
 
     @DeleteMapping("/del/{id}")
-    public AjaxResult del(@PathVariable("id") Integer id){
+    public R<?> del(@PathVariable("id") Integer id){
         staffSchedulingService.removeById(id);
-        return AjaxResult.success();
+        return R.ok();
     }
 
     /**
      * 鑾峰彇褰撳墠鐢ㄦ埛鏈�鏂版帓鐝褰�
      */
     @GetMapping("/getCurrentUserLatestScheduling")
-    public AjaxResult getCurrentUserLatestScheduling(){
-        return AjaxResult.success(staffSchedulingService.getCurrentUserLatestScheduling());
+    public R<?> getCurrentUserLatestScheduling(){
+        return R.ok(staffSchedulingService.getCurrentUserLatestScheduling());
     }
 
     @Log(title = "瀵煎嚭浜哄憳鎺掔彮鍒楄〃", businessType = BusinessType.EXPORT)
diff --git a/src/main/java/com/ruoyi/staff/service/SchemeApplicableStaffService.java b/src/main/java/com/ruoyi/staff/service/SchemeApplicableStaffService.java
index da9a2d7..9d7e610 100644
--- a/src/main/java/com/ruoyi/staff/service/SchemeApplicableStaffService.java
+++ b/src/main/java/com/ruoyi/staff/service/SchemeApplicableStaffService.java
@@ -1,7 +1,7 @@
 package com.ruoyi.staff.service;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.staff.pojo.SchemeApplicableStaff;
 import com.baomidou.mybatisplus.extension.service.IService;
 
@@ -17,11 +17,11 @@
  */
 public interface SchemeApplicableStaffService extends IService<SchemeApplicableStaff> {
 
-    AjaxResult listPage(Page page, SchemeApplicableStaff schemeApplicableStaff);
+    R<?> listPage(Page page, SchemeApplicableStaff schemeApplicableStaff);
 
-    AjaxResult add(SchemeApplicableStaff schemeApplicableStaff);
+    R<?> add(SchemeApplicableStaff schemeApplicableStaff);
 
-    AjaxResult updateSchemeApplicableStaff(SchemeApplicableStaff schemeApplicableStaff);
+    R<?> updateSchemeApplicableStaff(SchemeApplicableStaff schemeApplicableStaff);
 
-    AjaxResult delete(List<Long> ids);
+    R<?> delete(List<Long> ids);
 }
diff --git a/src/main/java/com/ruoyi/staff/service/StaffSalaryMainService.java b/src/main/java/com/ruoyi/staff/service/StaffSalaryMainService.java
index 1794e43..2003e68 100644
--- a/src/main/java/com/ruoyi/staff/service/StaffSalaryMainService.java
+++ b/src/main/java/com/ruoyi/staff/service/StaffSalaryMainService.java
@@ -1,7 +1,7 @@
 package com.ruoyi.staff.service;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.staff.dto.CalculateSalaryDto;
 import com.ruoyi.staff.pojo.StaffSalaryMain;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -18,13 +18,13 @@
  */
 public interface StaffSalaryMainService extends IService<StaffSalaryMain> {
 
-    AjaxResult listPage(Page page, StaffSalaryMain staffSalaryMain);
+    R listPage(Page page, StaffSalaryMain staffSalaryMain);
 
-    AjaxResult add(StaffSalaryMain staffSalaryMain);
+    R<?> add(StaffSalaryMain staffSalaryMain);
 
-    AjaxResult updateStaffSalaryMain(StaffSalaryMain staffSalaryMain);
+    R<?> updateStaffSalaryMain(StaffSalaryMain staffSalaryMain);
 
-    AjaxResult delete(List<Long> ids);
+    R<?> delete(List<Long> ids);
 
-    AjaxResult calculateSalary(CalculateSalaryDto calculateSalaryDto);
+    R<?> calculateSalary(CalculateSalaryDto calculateSalaryDto);
 }
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 bd61ca3..d57a25e 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java
+++ b/src/main/java/com/ruoyi/staff/service/impl/SchemeApplicableStaffServiceImpl.java
@@ -4,7 +4,7 @@
 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.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.production.bean.dto.UserAccountDto;
 import com.ruoyi.production.bean.dto.UserProductionAccountingDto;
 import com.ruoyi.production.service.SalesLedgerProductionAccountingService;
@@ -52,7 +52,7 @@
 
 
     @Override
-    public AjaxResult listPage(Page page, SchemeApplicableStaff schemeApplicableStaff) {
+    public R<?> listPage(Page page, SchemeApplicableStaff schemeApplicableStaff) {
         LambdaQueryWrapper<SchemeApplicableStaff> schemeApplicableStaffLambdaQueryWrapper = new LambdaQueryWrapper<>();
         if(schemeApplicableStaff != null){
             if(StringUtils.isNotEmpty(schemeApplicableStaff.getTitle())){
@@ -62,7 +62,7 @@
         Page<SchemeApplicableStaff> page1 = schemeApplicableStaffMapper.selectPage(page, schemeApplicableStaffLambdaQueryWrapper);
         List<Long> collect = page1.getRecords().stream().map(SchemeApplicableStaff::getId).collect(Collectors.toList());
         if(CollectionUtils.isEmpty(collect)){
-            return AjaxResult.success(page1);
+            return R.ok(page1);
         }
         List<SchemeInsuranceDetail> schemeInsuranceDetails = schemeInsuranceDetailMapper
                 .selectList(new LambdaQueryWrapper<SchemeInsuranceDetail>()
@@ -82,7 +82,7 @@
                 item.setDeptNames(sysDepts.stream().map(SysDept::getDeptName).collect(Collectors.joining(",")));
             }
         });
-        return AjaxResult.success(page1);
+        return R.ok(page1);
     }
 
     public void setSchemeApplicableStaffUserInfo(SchemeApplicableStaff schemeApplicableStaff) {
@@ -103,12 +103,12 @@
     }
 
     @Override
-    public AjaxResult add(SchemeApplicableStaff schemeApplicableStaff) {
+    public R<?> add(SchemeApplicableStaff schemeApplicableStaff) {
         if(schemeApplicableStaff == null){
-            return AjaxResult.error("鍙傛暟閿欒");
+            return R.fail("鍙傛暟閿欒");
         }
         if(CollectionUtils.isEmpty(schemeApplicableStaff.getSchemeInsuranceDetailList())){
-            return AjaxResult.error("璇烽�夋嫨鏂规鏄庣粏");
+            return R.fail("璇烽�夋嫨鏂规鏄庣粏");
         }
         setSchemeApplicableStaffUserInfo(schemeApplicableStaff); //鏍规嵁閮ㄩ棬璁剧疆鐢ㄦ埛淇℃伅
         int insert = schemeApplicableStaffMapper.insert(schemeApplicableStaff);
@@ -116,13 +116,13 @@
             item.setSchemeId(schemeApplicableStaff.getId());
             schemeInsuranceDetailMapper.insert(item);
         });
-        return AjaxResult.success(insert);
+        return R.ok(insert);
     }
 
     @Override
-    public AjaxResult updateSchemeApplicableStaff(SchemeApplicableStaff schemeApplicableStaff) {
+    public R<?> updateSchemeApplicableStaff(SchemeApplicableStaff schemeApplicableStaff) {
         if(schemeApplicableStaff == null){
-            return AjaxResult.error("鍙傛暟閿欒");
+            return R.fail("鍙傛暟閿欒");
         }
         setSchemeApplicableStaffUserInfo(schemeApplicableStaff); //鏍规嵁閮ㄩ棬璁剧疆鐢ㄦ埛淇℃伅
         int update = schemeApplicableStaffMapper.updateById(schemeApplicableStaff);
@@ -133,18 +133,18 @@
             item.setSchemeId(schemeApplicableStaff.getId());
             schemeInsuranceDetailMapper.insert(item);
         });
-        return AjaxResult.success(update);
+        return R.ok(update);
     }
 
     @Override
-    public AjaxResult delete(List<Long> ids) {
+    public R<?> delete(List<Long> ids) {
         if (CollectionUtils.isEmpty(ids)) {
-            return AjaxResult.error("鍙傛暟閿欒");
+            return R.fail("鍙傛暟閿欒");
         }
         int delete = schemeApplicableStaffMapper.deleteBatchIds(ids);
         schemeInsuranceDetailMapper.delete(new LambdaQueryWrapper<SchemeInsuranceDetail>()
                 .in(SchemeInsuranceDetail::getSchemeId, ids));
-        return AjaxResult.success(delete);
+        return R.ok(delete);
     }
 
     /**
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 7c11041..4f1e033 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
+++ b/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
@@ -1,12 +1,13 @@
 package com.ruoyi.staff.service.impl;
 
-
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.exception.base.BaseException;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.spring.SpringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.dto.WordDateDto;
 import com.ruoyi.project.system.domain.SysDept;
@@ -46,7 +47,7 @@
 
 @RequiredArgsConstructor
 @Service
-public class StaffOnJobServiceImpl extends ServiceImpl<StaffOnJobMapper, StaffOnJob>  implements IStaffOnJobService {
+public class StaffOnJobServiceImpl extends ServiceImpl<StaffOnJobMapper, StaffOnJob> implements IStaffOnJobService {
 
     private final StaffOnJobMapper staffOnJobMapper;
     private final SysDeptMapper sysDeptMapper;
@@ -64,22 +65,22 @@
     private final StaffEmergencyContactMapper staffEmergencyContactMapper;
     private final StaffEmergencyContactServiceImpl staffEmergencyContactServiceImpl;
 
-
-    //鍦ㄨ亴鍛樺伐鍙拌处鍒嗛〉鏌ヨ
+    // 鍦ㄨ亴鍛樺伐鍙拌处鍒嗛〉鏌ヨ
     @Override
     public IPage<StaffOnJobDto> staffOnJobListPage(Page page, StaffOnJob staffOnJob) {
-        return staffOnJobMapper.staffOnJobListPage(page,staffOnJob);
+        return staffOnJobMapper.staffOnJobListPage(page, staffOnJob);
     }
 
-    //鏂板鍏ヨ亴
+    // 鏂板鍏ヨ亴
     @Override
     @Transactional(rollbackFor = Exception.class)
     public int add(StaffOnJobDto staffOnJobPrams) {
-        String[] ignoreProperties = {"id"};//鎺掗櫎id灞炴��
+        String[] ignoreProperties = { "id" };// 鎺掗櫎id灞炴��
         // 鍒ゆ柇缂栧彿鏄惁瀛樺湪
-        List<StaffOnJob> staffOnJobs = staffOnJobMapper.selectList(Wrappers.<StaffOnJob>lambdaQuery().eq(StaffOnJob::getStaffNo, staffOnJobPrams.getStaffNo()));
-        if (staffOnJobs != null && !staffOnJobs.isEmpty()){
-            throw new BaseException("缂栧彿涓�"+staffOnJobPrams.getStaffNo()+"鐨勫憳宸ュ凡缁忓瓨鍦�,鏃犳硶鏂板!!!");
+        List<StaffOnJob> staffOnJobs = staffOnJobMapper.selectList(
+                Wrappers.<StaffOnJob>lambdaQuery().eq(StaffOnJob::getStaffNo, staffOnJobPrams.getStaffNo()));
+        if (staffOnJobs != null && !staffOnJobs.isEmpty()) {
+            throw new BaseException("缂栧彿涓�" + staffOnJobPrams.getStaffNo() + "鐨勫憳宸ュ凡缁忓瓨鍦�,鏃犳硶鏂板!!!");
         }
 
         // 鍒涘缓鍏ヨ亴鏁版嵁
@@ -88,23 +89,23 @@
         staffOnJobMapper.insert(staffOnJobPrams);
         // 鏌ヨ鐢ㄦ埛鏄惁宸茬粡鏂板
         SysUser sysUser = sysUserService.selectUserById(staffOnJobPrams.getId());
-        if(sysUser == null){
+        if (sysUser == null) {
             SysUser sysUser1 = new SysUser();
             sysUser1.setUserName(staffOnJobPrams.getStaffNo());
             sysUser1.setNickName(staffOnJobPrams.getStaffName());
             String s = SecurityUtils.encryptPassword("123456");
             sysUser1.setPassword(s);
-            if(staffOnJobPrams.getSysPostId() != null){
-                Long[] posts = new Long[]{staffOnJobPrams.getSysPostId().longValue()};
+            if (staffOnJobPrams.getSysPostId() != null) {
+                Long[] posts = new Long[] { staffOnJobPrams.getSysPostId().longValue() };
                 sysUser1.setPostIds(posts);
             }
-            sysUser1.setRoleIds(new Long[]{staffOnJobPrams.getRoleId()});
-            sysUser1.setDeptIds(new  Long[]{staffOnJobPrams.getSysDeptId()});
+            sysUser1.setRoleIds(new Long[] { staffOnJobPrams.getRoleId() });
+            sysUser1.setDeptIds(new Long[] { staffOnJobPrams.getSysDeptId() });
             sysUser1.setStatus("0");
             sysUserService.insertUser(sysUser1);
         }
         // 缁戝畾瀛愯〃鏁版嵁
-        bingingStaffOnJobExtra(staffOnJobPrams.getId(),staffOnJobPrams);
+        bingingStaffOnJobExtra(staffOnJobPrams.getId(), staffOnJobPrams);
         // 鍒涘缓鍚堝悓璁板綍
         StaffContract staffContract = new StaffContract();
         staffContract.setStaffOnJobId(staffOnJobPrams.getId());
@@ -114,32 +115,32 @@
         return staffContractMapper.insert(staffContract);
     }
 
-    //鏇存柊鍏ヨ亴淇℃伅
+    // 鏇存柊鍏ヨ亴淇℃伅
     @Override
     @Transactional(rollbackFor = Exception.class)
     public int update(Long id, StaffOnJobDto staffOnJobParams) {
         // 鍒ゆ柇瀵硅薄鏄惁瀛樺湪
         StaffOnJob job = staffOnJobMapper.selectById(id);
-        if (job == null){
-            throw new BaseException("缂栧彿涓�"+staffOnJobParams.getStaffNo()+"鐨勫憳宸ヤ笉瀛樺湪,鏃犳硶鏇存柊!!!");
+        if (job == null) {
+            throw new BaseException("缂栧彿涓�" + staffOnJobParams.getStaffNo() + "鐨勫憳宸ヤ笉瀛樺湪,鏃犳硶鏇存柊!!!");
         }
 
-        String[] ignoreProperties = {"id"};//鎺掗櫎鏇存柊灞炴��
+        String[] ignoreProperties = { "id" };// 鎺掗櫎鏇存柊灞炴��
 
         // 鑾峰彇鏈�鏂板悎鍚屾暟鎹紝骞朵笖鏇存柊
         StaffContract contract = staffContractMapper.selectOne(Wrappers.<StaffContract>lambdaQuery()
                 .eq(StaffContract::getStaffOnJobId, id)
                 .last("limit 1")
                 .orderByDesc(StaffContract::getId));
-        if (contract != null){
-            BeanUtils.copyProperties(staffOnJobParams,contract,ignoreProperties);
+        if (contract != null) {
+            BeanUtils.copyProperties(staffOnJobParams, contract, ignoreProperties);
             staffContractMapper.updateById(contract);
         }
 
         // 鍒犻櫎鎵�鏈夊瓙琛ㄦ暟鎹�
         delStaffOnJobExtra(Arrays.asList(id));
         // 缁戝畾瀛愯〃鏁版嵁
-        bingingStaffOnJobExtra(id,staffOnJobParams);
+        bingingStaffOnJobExtra(id, staffOnJobParams);
         // 鏇存柊鍛樺伐鏁版嵁
         staffOnJobParams.setContractExpireTime(staffOnJobParams.getContractEndTime());
         return staffOnJobMapper.updateById(staffOnJobParams);
@@ -147,26 +148,27 @@
 
     /**
      * 缁戝畾鍛樺伐瀛愯〃鏁版嵁
+     *
      * @param staffOnJobPrams
      * @param id
      */
-    public void bingingStaffOnJobExtra(Long id,StaffOnJob staffOnJobPrams) {
+    public void bingingStaffOnJobExtra(Long id, StaffOnJob staffOnJobPrams) {
         // 鏂板鏁欒偛缁忓巻
-        if(CollectionUtils.isNotEmpty(staffOnJobPrams.getStaffEducationList())){
+        if (CollectionUtils.isNotEmpty(staffOnJobPrams.getStaffEducationList())) {
             staffOnJobPrams.getStaffEducationList().stream()
                     .filter(Objects::nonNull) // 杩囨护null瀵硅薄锛岄伩鍏嶇┖鎸囬拡
                     .forEach(staff -> staff.setStaffOnJobId(id)); // 璧嬪��
             staffEducationService.saveBatch(staffOnJobPrams.getStaffEducationList());
         }
         // 鏂板宸ヤ綔缁忓巻
-        if(CollectionUtils.isNotEmpty(staffOnJobPrams.getStaffWorkExperienceList())){
+        if (CollectionUtils.isNotEmpty(staffOnJobPrams.getStaffWorkExperienceList())) {
             staffOnJobPrams.getStaffWorkExperienceList().stream()
                     .filter(Objects::nonNull) // 杩囨护null瀵硅薄锛岄伩鍏嶇┖鎸囬拡
                     .forEach(staff -> staff.setStaffOnJobId(id)); // 璧嬪��
             staffWorkExperienceServiceImpl.saveBatch(staffOnJobPrams.getStaffWorkExperienceList());
         }
         // 鏂板绱ф�ヨ仈绯讳汉
-        if(CollectionUtils.isNotEmpty(staffOnJobPrams.getStaffEmergencyContactList())){
+        if (CollectionUtils.isNotEmpty(staffOnJobPrams.getStaffEmergencyContactList())) {
             staffOnJobPrams.getStaffEmergencyContactList().stream()
                     .filter(Objects::nonNull) // 杩囨护null瀵硅薄锛岄伩鍏嶇┖鎸囬拡
                     .forEach(staff -> staff.setStaffOnJobId(id)); // 璧嬪��
@@ -174,27 +176,30 @@
         }
     }
 
-
     /**
      * 閫氳繃鍛樺伐id鍒犻櫎鏁欒偛缁忓巻锛屽伐浣滅粡鍘嗭紝绱ф�ヨ仈绯讳汉
+     *
      * @param ids
      * @return
      */
     public void delStaffOnJobExtra(List<Long> ids) {
         // 鍒犻櫎鏁欒偛缁忓巻
-        staffEducationService.remove(Wrappers.<StaffEducation>lambdaQuery().in(StaffEducation::getStaffOnJobId,ids));
+        staffEducationService.remove(Wrappers.<StaffEducation>lambdaQuery().in(StaffEducation::getStaffOnJobId, ids));
         // 鍒犻櫎宸ヤ綔缁忓巻
-        staffWorkExperienceServiceImpl.remove(Wrappers.<StaffWorkExperience>lambdaQuery().in(StaffWorkExperience::getStaffOnJobId,ids));
+        staffWorkExperienceServiceImpl
+                .remove(Wrappers.<StaffWorkExperience>lambdaQuery().in(StaffWorkExperience::getStaffOnJobId, ids));
         // 鍒犻櫎绱ф�ヨ仈绯讳汉
-        staffEmergencyContactServiceImpl.remove(Wrappers.<StaffEmergencyContact>lambdaQuery().in(StaffEmergencyContact::getStaffOnJobId,ids));
+        staffEmergencyContactServiceImpl
+                .remove(Wrappers.<StaffEmergencyContact>lambdaQuery().in(StaffEmergencyContact::getStaffOnJobId, ids));
     }
 
-    //鍒犻櫎鍏ヨ亴
+    // 鍒犻櫎鍏ヨ亴
     @Override
     @Transactional(rollbackFor = Exception.class)
     public int delStaffOnJobs(List<Integer> ids) {
-        List<StaffOnJob> staffOnJobs = staffOnJobMapper.selectList(Wrappers.<StaffOnJob>lambdaQuery().in(StaffOnJob::getId, ids));
-        if(CollectionUtils.isEmpty(staffOnJobs)){
+        List<StaffOnJob> staffOnJobs = staffOnJobMapper
+                .selectList(Wrappers.<StaffOnJob>lambdaQuery().in(StaffOnJob::getId, ids));
+        if (CollectionUtils.isEmpty(staffOnJobs)) {
             throw new BaseException("璇ュ憳宸ヤ笉瀛樺湪,鏃犳硶鍒犻櫎!!!");
         }
         // 鍒犻櫎鍏ヨ亴鏁版嵁
@@ -202,11 +207,13 @@
         // 鍒犻櫎绂昏亴鏁版嵁
         staffLeaveMapper.delete(Wrappers.<StaffLeave>lambdaQuery().in(StaffLeave::getStaffOnJobId, ids));
         // 鍒犻櫎鎵撳崱璁板綍
-        personalAttendanceRecordsMapper.delete(Wrappers.<PersonalAttendanceRecords>lambdaQuery().in(PersonalAttendanceRecords::getStaffOnJobId, ids));
+        personalAttendanceRecordsMapper.delete(
+                Wrappers.<PersonalAttendanceRecords>lambdaQuery().in(PersonalAttendanceRecords::getStaffOnJobId, ids));
         // 鍒犻櫎鐢ㄦ埛鏁版嵁
         List<SysUser> sysUsers = sysUserMapper.selectList(Wrappers.<SysUser>lambdaQuery()
-                .in(SysUser::getUserName, staffOnJobs.stream().map(StaffOnJob::getStaffNo).collect(Collectors.toList())));
-        if(CollectionUtils.isNotEmpty(sysUsers)){
+                .in(SysUser::getUserName,
+                        staffOnJobs.stream().map(StaffOnJob::getStaffNo).collect(Collectors.toList())));
+        if (CollectionUtils.isNotEmpty(sysUsers)) {
             Long[] longs = sysUsers.stream().map(SysUser::getUserId).toArray(Long[]::new);
             sysUserService.deleteUserByIds(longs);
         }
@@ -214,7 +221,8 @@
         delStaffOnJobExtra(ids.stream().map(Integer::longValue).collect(Collectors.toList()));
 
         // 鍒犻櫎鍚堝悓鏁版嵁
-        return staffContractMapper.delete(Wrappers.<StaffContract>lambdaQuery().in(StaffContract::getStaffOnJobId, ids));
+        return staffContractMapper
+                .delete(Wrappers.<StaffContract>lambdaQuery().in(StaffContract::getStaffOnJobId, ids));
     }
 
     // 缁鍚堝悓
@@ -223,7 +231,7 @@
     public int renewContract(Long id, StaffContract staffContract) {
         // 鍒ゆ柇瀵硅薄鏄惁瀛樺湪
         StaffOnJob job = staffOnJobMapper.selectById(id);
-        if (job == null){
+        if (job == null) {
             throw new BaseException("璇ュ憳宸ヤ笉瀛樺湪,鏃犳硶鏇存柊!!!");
         }
 
@@ -241,10 +249,10 @@
         return 0;
     }
 
-    //鍦ㄨ亴鍛樺伐璇︽儏
+    // 鍦ㄨ亴鍛樺伐璇︽儏
     @Override
     public StaffOnJobDto staffOnJobDetail(Long id) {
-        StaffOnJob staffOnJob  = staffOnJobMapper.selectById(id);
+        StaffOnJob staffOnJob = staffOnJobMapper.selectById(id);
         if (staffOnJob == null) {
             throw new IllegalArgumentException("璇ュ憳宸ヤ笉瀛樺湪");
         }
@@ -264,7 +272,7 @@
                 .eq(StaffContract::getStaffOnJobId, staffOnJob.getId())
                 .last("limit 1")
                 .orderByDesc(StaffContract::getId));
-        if (contract != null){
+        if (contract != null) {
             staffOnJobDto.setContractTerm(contract.getContractTerm());
             staffOnJobDto.setContractStartTime(contract.getContractStartTime());
             staffOnJobDto.setContractEndTime(contract.getContractEndTime());
@@ -272,14 +280,16 @@
         // 鑾峰彇瀛愯〃鏁版嵁
         staffOnJobDto.setStaffEducationList(staffEducationMapper.selectList(Wrappers.<StaffEducation>lambdaQuery()
                 .eq(StaffEducation::getStaffOnJobId, staffOnJob.getId())));
-        staffOnJobDto.setStaffWorkExperienceList(staffWorkExperienceMapper.selectList(Wrappers.<StaffWorkExperience>lambdaQuery()
-                .eq(StaffWorkExperience::getStaffOnJobId, staffOnJob.getId())));
-        staffOnJobDto.setStaffEmergencyContactList(staffEmergencyContactMapper.selectList(Wrappers.<StaffEmergencyContact>lambdaQuery()
-                .eq(StaffEmergencyContact::getStaffOnJobId, staffOnJob.getId())));
+        staffOnJobDto.setStaffWorkExperienceList(
+                staffWorkExperienceMapper.selectList(Wrappers.<StaffWorkExperience>lambdaQuery()
+                        .eq(StaffWorkExperience::getStaffOnJobId, staffOnJob.getId())));
+        staffOnJobDto.setStaffEmergencyContactList(
+                staffEmergencyContactMapper.selectList(Wrappers.<StaffEmergencyContact>lambdaQuery()
+                        .eq(StaffEmergencyContact::getStaffOnJobId, staffOnJob.getId())));
         return staffOnJobDto;
     }
 
-    //鍦ㄨ亴鍛樺伐瀵煎嚭
+    // 鍦ㄨ亴鍛樺伐瀵煎嚭
     @Override
     public void staffOnJobExport(HttpServletResponse response, StaffOnJob staffOnJob) {
         List<StaffOnJobDto> staffOnJobs = staffOnJobMapper.staffOnJobList(staffOnJob);
@@ -298,39 +308,62 @@
         try {
             ExcelUtil<StaffOnJobExcelDto> util = new ExcelUtil<>(StaffOnJobExcelDto.class);
             List<StaffOnJobExcelDto> staffOnJobs = util.importExcel(file.getInputStream());
-            if (CollectionUtils.isEmpty(staffOnJobs)){
+            if (CollectionUtils.isEmpty(staffOnJobs)) {
                 return false;
             }
             // 鑾峰彇鎵�鏈夐儴闂ㄦ暟鎹�
-            List<SysDept> sysDepts = sysDeptMapper.selectList(Wrappers.<SysDept>lambdaQuery().eq(SysDept::getDelFlag, 0));
+            List<SysDept> sysDepts = sysDeptMapper
+                    .selectList(Wrappers.<SysDept>lambdaQuery().eq(SysDept::getDelFlag, 0));
             // 鑾峰彇鎵�鏈夎鑹叉暟鎹�
             List<SysRole> sysRoles = sysRoleMapper.selectRoleAll();
             staffOnJobs.forEach(staffOnJob -> {
+                // 澶勭悊鍚堝悓鏈熼檺鏁版嵁鏍煎紡
+                if (staffOnJob.getContractTerm() != null && !staffOnJob.getContractTerm().trim().isEmpty()) {
+                    String term = staffOnJob.getContractTerm().trim();
+                    try {
+                        Integer.parseInt(term);
+                    } catch (NumberFormatException e) {
+                        throw new ServiceException("鍛樺伐[" + staffOnJob.getStaffName() + "]鐨勫悎鍚屾湡闄怺"
+                                + staffOnJob.getContractTerm() + "]鏍煎紡涓嶆纭紝蹇呴』涓虹函鏁板瓧(濡�: 1, 2, 3)");
+                    }
+                }
                 StaffOnJobDto staffOnJobDto = new StaffOnJobDto();
                 BeanUtils.copyProperties(staffOnJob, staffOnJobDto);
                 // 閫氳繃鍚嶇О鑾峰彇閮ㄩ棬id
-                staffOnJobDto.setSysDeptId(// ... existing code ...
-                        sysDepts.stream()
-                            .filter(dept -> dept.getDeptName() != null && dept.getDeptName().equals(staffOnJob.getSysDeptName()))
-                            .findFirst()
-                            .map(SysDept::getDeptId)
-                            .orElse(null)
-                        );
+                Long deptId = sysDepts.stream()
+                        .filter(dept -> dept.getDeptName() != null
+                                && dept.getDeptName().equals(staffOnJob.getSysDeptName()))
+                        .findFirst()
+                        .map(SysDept::getDeptId)
+                        .orElse(null);
+                if (deptId == null) {
+                    throw new ServiceException(
+                            "鍛樺伐[" + staffOnJob.getStaffName() + "]鐨勯儴闂╗" + staffOnJob.getSysDeptName() + "]涓嶅瓨鍦紝璇锋鏌ユ暟鎹�");
+                }
+                staffOnJobDto.setSysDeptId(deptId);
+
                 // 閫氳繃鍚嶇О鑾峰彇瑙掕壊id
-                staffOnJobDto.setRoleId(sysRoles.stream()
-                        .filter(role -> role.getRoleName() != null && role.getRoleName().equals(staffOnJob.getRoleName()))
+                Long roleId = sysRoles.stream()
+                        .filter(role -> role.getRoleName() != null
+                                && role.getRoleName().equals(staffOnJob.getRoleName()))
                         .findFirst()
                         .map(SysRole::getRoleId)
-                        .orElse( null));
-                add(staffOnJobDto);
+                        .orElse(null);
+                if (roleId == null) {
+                    throw new ServiceException(
+                            "鍛樺伐[" + staffOnJob.getStaffName() + "]鐨勮鑹瞇" + staffOnJob.getRoleName() + "]涓嶅瓨鍦紝璇锋鏌ユ暟鎹�");
+                }
+                staffOnJobDto.setRoleId(roleId);
+                SpringUtils.getAopProxy(this).add(staffOnJobDto);
             });
             return true;
+        } catch (ServiceException | BaseException e) {
+            throw e;
         } catch (Exception e) {
-            e.printStackTrace();
-            return false;
+            log.error("鍛樺伐鍙拌处瀵煎叆澶辫触 : " + e.getMessage());
+            throw new ServiceException("瀵煎叆澶辫触: " + e.getMessage());
         }
     }
-
 
     @Override
     public String exportCopy(HttpServletResponse response, StaffOnJob staffOnJob) throws Exception {
@@ -339,7 +372,7 @@
         // 璁剧疆妯℃澘鏂囦欢鎵�鍦ㄧ洰褰曪紙缁濆璺緞锛屼緥濡傦細/templates/锛�
         cfg.setClassForTemplateLoading(StaffOnJobServiceImpl.class, "/static");
         cfg.setDefaultEncoding("UTF-8");
-        //2.瀹氫箟闇�瑕佸~鍏呯殑鍙橀噷
+        // 2.瀹氫箟闇�瑕佸~鍏呯殑鍙橀噷
         // 鈶� 鏋勯�犲憳宸ヤ俊鎭紙瀹為檯椤圭洰涓彲浠庢暟鎹簱/Excel璇诲彇锛�
         WordDateDto staff = new WordDateDto();
         BeanUtils.copyProperties(staffOnJob, staff);
@@ -349,7 +382,7 @@
         Instant instant = staff.getContractExpireTime().toInstant();
 
         // 涔熷彲浠ユ寚瀹氬叿浣撴椂鍖猴紝渚嬪Asia/Shanghai锛�
-        LocalDate localDate = instant.atZone(ZoneId.of("Asia/Shanghai")).toLocalDate();  // 鍚堝悓缁撴潫鏃堕棿
+        LocalDate localDate = instant.atZone(ZoneId.of("Asia/Shanghai")).toLocalDate(); // 鍚堝悓缁撴潫鏃堕棿
         LocalDate localDate1 = localDate.minusYears(Integer.parseInt(staff.getContractTerm()));// 鍚堝悓寮�濮嬫椂闂�
 
         // 绛捐鏃ユ湡杞崲lcoaldate
@@ -362,7 +395,7 @@
         staff.setQyear(localDate2.getYear() + "");
         staff.setQmoth(localDate2.getMonthValue() + "");
         staff.setQday(localDate2.getDayOfMonth() + "");
-        if(staff.getDateSelect().equals("A")){
+        if (staff.getDateSelect().equals("A")) {
             staff.setSyear(localDate1.getYear() + "");
             staff.setSmoth(localDate1.getMonthValue() + "");
             staff.setSday(localDate1.getDayOfMonth() + "");
@@ -376,7 +409,7 @@
             staff.setSeyear(localDate4.getYear() + "");
             staff.setSemoth(localDate4.getMonthValue() + "");
             staff.setSeday(localDate4.getDayOfMonth() + "");
-        }else if (staff.getDateSelect().equals("B")){
+        } else if (staff.getDateSelect().equals("B")) {
 
             staff.setBsyear(localDate1.getYear() + "");
             staff.setBsmoth(localDate1.getMonthValue() + "");
@@ -388,29 +421,27 @@
             staff.setBseyear(localDate4.getYear() + "");
             staff.setBsemoth(localDate4.getMonthValue() + "");
             staff.setBseday(localDate4.getDayOfMonth() + "");
-        }else if (staff.getDateSelect().equals("C")){
+        } else if (staff.getDateSelect().equals("C")) {
             staff.setCsyear(localDate1.getYear() + "");
             staff.setCsmoth(localDate1.getMonthValue() + "");
             staff.setCsday(localDate1.getDayOfMonth() + "");
         }
 
-        Map<String,Object> data = new HashMap<>();
-        data.put("item",staff);
-        //3.鍔犺浇XML 妯℃澘
+        Map<String, Object> data = new HashMap<>();
+        data.put("item", staff);
+        // 3.鍔犺浇XML 妯℃澘
         Template template = cfg.getTemplate("鍔冲姩鍚堝悓涔�.xml");
-        //4.鐢熸垚濉厖鍚庣殑 XML 鍐呭
+        // 4.鐢熸垚濉厖鍚庣殑 XML 鍐呭
         StringWriter out = new StringWriter();
         template.process(data, out);
         String filledXml = out.toString();
-        //5.灏哫ML鍐呭鍐欏叆浜や欢骞舵敼涓�.docx 鏍煎紡
+        // 5.灏哫ML鍐呭鍐欏叆浜や欢骞舵敼涓�.docx 鏍煎紡
         File outputFile = new File(url);
-        try(FileOutputStream fos = new FileOutputStream(outputFile);
-            OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8)) {
+        try (FileOutputStream fos = new FileOutputStream(outputFile);
+                OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8)) {
             osw.write(filledXml);
         }
         return url;
     }
-
-
 
 }
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 a6d4500..d6eac65 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/StaffSalaryMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/staff/service/impl/StaffSalaryMainServiceImpl.java
@@ -7,7 +7,7 @@
 import com.ruoyi.account.pojo.AccountExpense;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.project.system.mapper.SysUserDeptMapper;
 import com.ruoyi.staff.dto.CalculateSalaryDto;
 import com.ruoyi.staff.mapper.StaffLeaveMapper;
@@ -48,7 +48,7 @@
     private final AccountExpenseMapper accountExpenseMapper;
 
     @Override
-    public AjaxResult listPage(Page page, StaffSalaryMain staffSalaryMain) {
+    public R<?> listPage(Page page, StaffSalaryMain staffSalaryMain) {
         LambdaQueryWrapper<StaffSalaryMain> staffSalaryMainLambdaQueryWrapper = new LambdaQueryWrapper<>();
         if(staffSalaryMain != null){
             if(StringUtils.isNotEmpty(staffSalaryMain.getSalaryTitle())){
@@ -66,31 +66,31 @@
             List<StaffSalaryDetail> staffSalaryDetailList = staffSalaryDetailMapper.selectList(new LambdaQueryWrapper<StaffSalaryDetail>().eq(StaffSalaryDetail::getMainId, main.getId()));
             main.setStaffSalaryDetailList(staffSalaryDetailList);
         });
-        return AjaxResult.success(page1);
+        return R.ok(page1);
     }
 
     @Override
-    public AjaxResult add(StaffSalaryMain staffSalaryMain) {
+    public R<?> add(StaffSalaryMain staffSalaryMain) {
         staffSalaryMainMapper.insert(staffSalaryMain);
         staffSalaryMain.getStaffSalaryDetailList().forEach(detail -> {
             detail.setMainId(staffSalaryMain.getId());
         });
         staffSalaryDetailService.saveBatch(staffSalaryMain.getStaffSalaryDetailList());
-        return AjaxResult.success("鏂板鎴愬姛");
+        return R.ok(null, "鏂板鎴愬姛");
     }
 
     @Override
-    public AjaxResult updateStaffSalaryMain(StaffSalaryMain staffSalaryMain) {
+    public R<?> updateStaffSalaryMain(StaffSalaryMain staffSalaryMain) {
         if(staffSalaryMain == null){
-            return AjaxResult.error("鍙傛暟閿欒");
+            return R.fail("鍙傛暟閿欒");
         }
         StaffSalaryMain staffSalaryMain1 = staffSalaryMainMapper.selectById(staffSalaryMain.getId());
         if(staffSalaryMain1 == null){
-            return AjaxResult.error("鍙傛暟閿欒");
+            return R.fail("鍙傛暟閿欒");
         }
         // 寰呭鏍镐笉鍙紪杈�
 //        if(staffSalaryMain1.getStatus() > 3){
-//            return AjaxResult.error("寰呭鏍镐笉鍙紪杈�");
+//            return R.fail("寰呭鏍镐笉鍙紪杈�");
 //        }
         staffSalaryMainMapper.updateById(staffSalaryMain);
         if(org.apache.commons.collections4.CollectionUtils.isNotEmpty(staffSalaryMain.getStaffSalaryDetailList())){
@@ -115,27 +115,27 @@
             accountExpense.setInputTime(new Date());
             accountExpenseMapper.insert(accountExpense);
         }
-        return AjaxResult.success("淇敼鎴愬姛");
+        return R.ok(null, "淇敼鎴愬姛");
     }
 
     @Override
-    public AjaxResult delete(List<Long> ids) {
+    public R<?> delete(List<Long> ids) {
         if(CollectionUtils.isEmpty(ids)){
-            return AjaxResult.error("鍙傛暟閿欒");
+            return R.fail("鍙傛暟閿欒");
         }
         staffSalaryMainMapper.deleteBatchIds(ids);
         staffSalaryDetailMapper.delete(new LambdaQueryWrapper<StaffSalaryDetail>().in(StaffSalaryDetail::getMainId, ids));
-        return AjaxResult.success("鍒犻櫎鎴愬姛");
+        return R.ok(null, "鍒犻櫎鎴愬姛");
     }
 
     @Override
-    public AjaxResult calculateSalary(CalculateSalaryDto calculateSalaryDto) {
+    public R<?> calculateSalary(CalculateSalaryDto calculateSalaryDto) {
         if(CollectionUtils.isEmpty(calculateSalaryDto.getIds())){
-            return AjaxResult.error("鍙傛暟閿欒");
+            return R.fail("鍙傛暟閿欒");
         }
         List<Map<String, Object>> longs = setSchemeApplicableStaffUserInfo(calculateSalaryDto.getIds()); // 閫氳繃閮ㄩ棬ids鑾峰彇鐢ㄦ埛淇℃伅
         if(CollectionUtils.isEmpty(longs)){
-            return AjaxResult.error("鏃犲憳宸�");
+            return R.fail("鏃犲憳宸�");
         }
         List<Map<String, Object>> mapList = new ArrayList<>();
         for (Map<String, Object> id : longs) {
@@ -151,7 +151,7 @@
             schemeApplicableStaffService.calculateByEmployeeId((Integer) id.get("id"),id,calculateSalaryDto.getDate());
             mapList.add(id);
         }
-        return AjaxResult.success(mapList);
+        return R.ok(mapList);
     }
 
     public List<Map<String, Object>> setSchemeApplicableStaffUserInfo(List<Long> ids) {
diff --git a/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java b/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java
index 1887b27..f26bc5f 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java
@@ -4,7 +4,8 @@
 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.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.service.StockInRecordService;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -20,37 +21,37 @@
 @Tag(name = "鍏ュ簱")
 @RequestMapping("/stockInRecord")
 @RequiredArgsConstructor
-public class StockInRecordController {
+public class StockInRecordController extends BaseController {
 
     private final StockInRecordService stockInRecordService;
 
     @GetMapping("/listPage")
     @Log(title = "鐢熶骇鍏ュ簱-鍏ュ簱绠$悊-鍒楄〃", businessType = BusinessType.OTHER)
     @Operation(summary = "鍏ュ簱绠$悊鍒楄〃")
-    public AjaxResult listPage(Page page, StockInRecordDto stockInRecordDto) {
+    public R<?> listPage(Page page, StockInRecordDto stockInRecordDto) {
         IPage<StockInRecordDto> result = stockInRecordService.listPage(page, stockInRecordDto);
-        return AjaxResult.success(result);
+        return R.ok(result);
     }
 
 
 
     @DeleteMapping("")
     @Log(title = "鍏ュ簱绠$悊-鍒犻櫎鍏ュ簱", businessType = BusinessType.DELETE)
-    public AjaxResult delete(@RequestBody List<Long> ids) {
+    public R<?> delete(@RequestBody List<Long> ids) {
         if(CollectionUtils.isEmpty(ids)){
-            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+            return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         }
-        return AjaxResult.success(stockInRecordService.batchDelete(ids));
+        return R.ok(stockInRecordService.batchDelete(ids));
     }
 
     @DeleteMapping("/pending")
     @Log(title = "鍏ュ簱绠$悊-鍒犻櫎寰呭鎵瑰叆搴�", businessType = BusinessType.DELETE)
     @Operation(summary = "鍒犻櫎寰呭鎵圭殑鍏ュ簱璁板綍")
-    public AjaxResult deletePending(@RequestBody List<Long> ids) {
+    public R<?> deletePending(@RequestBody List<Long> ids) {
         if(CollectionUtils.isEmpty(ids)){
-            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+            return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         }
-        return AjaxResult.success(stockInRecordService.batchDeletePending(ids));
+        return R.ok(stockInRecordService.batchDeletePending(ids));
     }
 
     @PostMapping("/exportStockInRecord")
@@ -62,12 +63,12 @@
     @PostMapping("/approve")
     @Log(title = "鍏ュ簱绠$悊-瀹℃壒鍏ュ簱", businessType = BusinessType.UPDATE)
     @Operation(summary = "鎵归噺瀹℃壒鍏ュ簱璁板綍")
-    public AjaxResult approve(@RequestBody StockInRecordDto approveDto) {
+    public R<?> approve(@RequestBody StockInRecordDto approveDto) {
         if(CollectionUtils.isEmpty(approveDto.getIds())){
-            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+            return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         }
         stockInRecordService.batchApprove(approveDto.getIds(), approveDto.getApprovalStatus());
-        return AjaxResult.success();
+        return R.ok();
     }
 
 }
diff --git a/src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java b/src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java
index 7351890..c99458b 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java
@@ -4,16 +4,16 @@
 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.framework.web.domain.R;
 import com.ruoyi.stock.dto.StockOutRecordDto;
 import com.ruoyi.stock.service.StockOutRecordService;
-import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletResponse;
 import lombok.AllArgsConstructor;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
-import jakarta.servlet.http.HttpServletResponse;
 import java.util.List;
 
 /**
@@ -34,40 +34,40 @@
     @GetMapping("/listPage")
     @Log(title = "鐢熶骇鍑哄簱-鍑哄簱绠$悊-鍒楄〃", businessType = BusinessType.OTHER)
     @Operation(summary = "鍑哄簱绠$悊鍒楄〃")
-    public AjaxResult listPage(Page page, StockOutRecordDto stockOutRecordDto) {
+    public R listPage(Page page, StockOutRecordDto stockOutRecordDto) {
         IPage<StockOutRecordDto> result = stockOutRecordService.listPage(page, stockOutRecordDto);
-        return AjaxResult.success(result);
+        return R.ok(result);
     }
 
     @PostMapping("")
     @Log(title = "鍑哄簱绠$悊-鏂板鍑哄簱", businessType = BusinessType.INSERT)
-    public AjaxResult add(@RequestBody StockOutRecordDto stockOutRecordDto) {
-        return AjaxResult.success(stockOutRecordService.add(stockOutRecordDto));
+    public R add(@RequestBody StockOutRecordDto stockOutRecordDto) {
+        return R.ok(stockOutRecordService.add(stockOutRecordDto));
     }
 
     @PutMapping("/{id}")
     @Log(title = "鍑哄簱绠$悊-鏇存柊鍑哄簱", businessType = BusinessType.UPDATE)
-    public AjaxResult update(@PathVariable("id") Long id, @RequestBody StockOutRecordDto stockOutRecordDto) {
-        return AjaxResult.success(stockOutRecordService.update(id, stockOutRecordDto));
+    public R update(@PathVariable("id") Long id, @RequestBody StockOutRecordDto stockOutRecordDto) {
+        return R.ok(stockOutRecordService.update(id, stockOutRecordDto));
     }
 
     @DeleteMapping("")
     @Log(title = "鍑哄簱绠$悊-鍒犻櫎鍑哄簱", businessType = BusinessType.DELETE)
-    public AjaxResult delete(@RequestBody List<Long> ids) {
+    public R delete(@RequestBody List<Long> ids) {
         if(CollectionUtils.isEmpty(ids)){
-            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+            return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         }
-        return AjaxResult.success(stockOutRecordService.batchDelete(ids));
+        return R.ok(stockOutRecordService.batchDelete(ids));
     }
 
     @DeleteMapping("/pending")
     @Log(title = "鍑哄簱绠$悊-鍒犻櫎寰呭鎵瑰嚭搴�", businessType = BusinessType.DELETE)
     @Operation(summary = "鍒犻櫎寰呭鎵圭殑鍑哄簱璁板綍")
-    public AjaxResult deletePending(@RequestBody List<Long> ids) {
+    public R deletePending(@RequestBody List<Long> ids) {
         if(CollectionUtils.isEmpty(ids)){
-            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+            return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         }
-        return AjaxResult.success(stockOutRecordService.batchDeletePending(ids));
+        return R.ok(stockOutRecordService.batchDeletePending(ids));
     }
 
     @PostMapping("/exportStockOutRecord")
@@ -79,12 +79,12 @@
     @PostMapping("/approve")
     @Log(title = "鍑哄簱绠$悊-瀹℃壒鍑哄簱", businessType = BusinessType.UPDATE)
     @Operation(summary = "鎵归噺瀹℃壒鍑哄簱璁板綍")
-    public AjaxResult approve(@RequestBody StockOutRecordDto approveDto) {
+    public R approve(@RequestBody StockOutRecordDto approveDto) {
         if(CollectionUtils.isEmpty(approveDto.getIds())){
-            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+            return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         }
         stockOutRecordService.batchApprove(approveDto.getIds(), approveDto.getApprovalStatus());
-        return AjaxResult.success();
+        return R.ok();
     }
 
 }
diff --git a/src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java b/src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java
index 56ad762..17d7e77 100644
--- a/src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java
+++ b/src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java
@@ -18,6 +18,11 @@
      */
     private String model;
     /**
+     * 鎵规鍙�
+     */
+    private String batchNo;
+
+    /**
      * 浜у搧鍗曚綅
      */
     private String unit;
diff --git a/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java b/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
index bc08eee..10a17e9 100644
--- a/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
+++ b/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
@@ -79,4 +79,7 @@
 
     @Schema(description = "浜у搧id")
     private Long productId;
+
+    @Schema(description = "鎵规鍙�")
+    private String batchNo;
 }
diff --git a/src/main/java/com/ruoyi/stock/dto/StockOutRecordDto.java b/src/main/java/com/ruoyi/stock/dto/StockOutRecordDto.java
index 022be78..0419f2f 100644
--- a/src/main/java/com/ruoyi/stock/dto/StockOutRecordDto.java
+++ b/src/main/java/com/ruoyi/stock/dto/StockOutRecordDto.java
@@ -21,6 +21,10 @@
      */
     private String model;
     /**
+     * 鎵规鍙�
+     */
+    private String batchNo;
+    /**
      * 浜у搧鍗曚綅
      */
     private String unit;
diff --git a/src/main/java/com/ruoyi/stock/mapper/StockInRecordMapper.java b/src/main/java/com/ruoyi/stock/mapper/StockInRecordMapper.java
index 4dd64c7..7d746ac 100644
--- a/src/main/java/com/ruoyi/stock/mapper/StockInRecordMapper.java
+++ b/src/main/java/com/ruoyi/stock/mapper/StockInRecordMapper.java
@@ -3,8 +3,8 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.account.bean.dto.PurchaseInboundDto;
-import com.ruoyi.account.bean.vo.PurchaseInboundVo;
+import com.ruoyi.account.bean.dto.purchase.PurchaseInboundDto;
+import com.ruoyi.account.bean.vo.purchase.PurchaseInboundVo;
 import com.ruoyi.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.execl.StockInRecordExportData;
 import com.ruoyi.stock.pojo.StockInRecord;
diff --git a/src/main/java/com/ruoyi/stock/mapper/StockOutRecordMapper.java b/src/main/java/com/ruoyi/stock/mapper/StockOutRecordMapper.java
index eb05e8c..c391587 100644
--- a/src/main/java/com/ruoyi/stock/mapper/StockOutRecordMapper.java
+++ b/src/main/java/com/ruoyi/stock/mapper/StockOutRecordMapper.java
@@ -3,8 +3,8 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.account.bean.dto.SalesOutboundDto;
-import com.ruoyi.account.bean.vo.SalesOutboundVo;
+import com.ruoyi.account.bean.dto.sales.SalesOutboundDto;
+import com.ruoyi.account.bean.vo.sales.SalesOutboundVo;
 import com.ruoyi.stock.dto.StockOutRecordDto;
 import com.ruoyi.stock.execl.StockOutRecordExportData;
 import com.ruoyi.stock.pojo.StockOutRecord;
diff --git a/src/main/java/com/ruoyi/technology/controller/TechnologyOperationParamController.java b/src/main/java/com/ruoyi/technology/controller/TechnologyOperationParamController.java
index 061a50c..2932068 100644
--- a/src/main/java/com/ruoyi/technology/controller/TechnologyOperationParamController.java
+++ b/src/main/java/com/ruoyi/technology/controller/TechnologyOperationParamController.java
@@ -2,7 +2,7 @@
 
 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.framework.web.controller.BaseController;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.technology.bean.dto.TechnologyOperationParamDto;
 import com.ruoyi.technology.bean.vo.TechnologyOperationParamVo;
@@ -19,7 +19,7 @@
 @RequestMapping("/technologyOperationParam")
 @Tag(name = "宸ュ簭鍙傛暟")
 @RequiredArgsConstructor
-public class TechnologyOperationParamController {
+public class TechnologyOperationParamController extends BaseController {
 
     private final TechnologyOperationParamService technologyOperationParamService;
 
@@ -38,7 +38,7 @@
     @DeleteMapping("/batchDelete/{id}")
     @Log(title = "Delete technology operation param", businessType = BusinessType.DELETE)
     @Operation(summary = "鍒犻櫎宸ュ簭鍙傛暟")
-    public AjaxResult batchDelete(@PathVariable("id") Long id) {
-        return AjaxResult.success(technologyOperationParamService.batchDelete(id));
+    public R<?> batchDelete(@PathVariable("id") Long id) {
+        return R.ok(technologyOperationParamService.batchDelete(id));
     }
 }
diff --git a/src/main/java/com/ruoyi/warehouse/controller/DocumentClassificationController.java b/src/main/java/com/ruoyi/warehouse/controller/DocumentClassificationController.java
index 7b51803..a02f8bd 100644
--- a/src/main/java/com/ruoyi/warehouse/controller/DocumentClassificationController.java
+++ b/src/main/java/com/ruoyi/warehouse/controller/DocumentClassificationController.java
@@ -3,7 +3,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.warehouse.pojo.DocumentClassification;
 import com.ruoyi.warehouse.service.DocumentClassificationService;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -23,30 +23,30 @@
 
     //鏍戠粨鏋�
     @GetMapping("/getList")
-    public AjaxResult getList() {
-        return AjaxResult.success(documentClassificationService.selectDocumentClassificationList());
+    public R<?> getList() {
+        return R.ok(documentClassificationService.selectDocumentClassificationList());
     }
 
     @PostMapping("/add")
     @Operation(summary = "鏂囨。鍒嗙被-娣诲姞")
     @Log(title = "鏂囨。鍒嗙被-娣诲姞", businessType = BusinessType.INSERT)
-    public AjaxResult add(@RequestBody DocumentClassification documentClassification) {
-        return AjaxResult.success(documentClassificationService.save(documentClassification));
+    public R<?> add(@RequestBody DocumentClassification documentClassification) {
+        return R.ok(documentClassificationService.save(documentClassification));
     }
 
     @PutMapping("/update")
     @Operation(summary = "鏂囨。鍒嗙被-鏇存柊")
     @Log(title = "鏂囨。鍒嗙被-鏇存柊", businessType = BusinessType.UPDATE)
-    public AjaxResult update(@RequestBody DocumentClassification documentClassification) {
-        return AjaxResult.success(documentClassificationService.updateById(documentClassification));
+    public R<?> update(@RequestBody DocumentClassification documentClassification) {
+        return R.ok(documentClassificationService.updateById(documentClassification));
     }
 
     @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(documentClassificationService.deleteByIds(ids));
+    public R<?> delete(@RequestBody List<Long> ids) {
+        if (CollectionUtils.isEmpty(ids)) return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        return R.ok(documentClassificationService.deleteByIds(ids));
     }
 
 }
diff --git a/src/main/java/com/ruoyi/warehouse/controller/DocumentationBorrowManagementController.java b/src/main/java/com/ruoyi/warehouse/controller/DocumentationBorrowManagementController.java
index 2a1c966..cb51df9 100644
--- a/src/main/java/com/ruoyi/warehouse/controller/DocumentationBorrowManagementController.java
+++ b/src/main/java/com/ruoyi/warehouse/controller/DocumentationBorrowManagementController.java
@@ -4,7 +4,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.warehouse.mapper.DocumentationReturnManagementMapper;
 import com.ruoyi.warehouse.pojo.DocumentationBorrowManagement;
 import com.ruoyi.warehouse.pojo.DocumentationReturnManagement;
@@ -30,64 +30,64 @@
     @GetMapping("/listPage")
     @Operation(summary = "鏂囨。鍊熼槄绠$悊-鍊熼槄鍒嗛〉鏌ヨ")
     @Log(title = "鏂囨。鍊熼槄绠$悊-鍊熼槄鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
-    public AjaxResult listPage(Page page, DocumentationBorrowManagement documentationBorrowManagement) {
-        return AjaxResult.success(documentationBorrowManagementService.listPage(page, documentationBorrowManagement));
+    public R<?> listPage(Page page, DocumentationBorrowManagement documentationBorrowManagement) {
+        return R.ok(documentationBorrowManagementService.listPage(page, documentationBorrowManagement));
     }
     @GetMapping("/list")
     @Operation(summary = "鏂囨。鍊熼槄绠$悊-鍊熼槄鏌ヨ")
     @Log(title = "鏂囨。鍊熼槄绠$悊-鍊熼槄鏌ヨ", businessType = BusinessType.OTHER)
-    public AjaxResult list() {
-        return AjaxResult.success(documentationBorrowManagementService.listAll());
+    public R<?> list() {
+        return R.ok(documentationBorrowManagementService.listAll());
     }
     @GetMapping("/listPageReturn")
     @Operation(summary = "鏂囨。鍊熼槄绠$悊-褰掕繕鍒嗛〉鏌ヨ")
     @Log(title = "鏂囨。鍊熼槄绠$悊-褰掕繕鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
-    public AjaxResult listPageReturn(Page page, DocumentationReturnManagement documentationReturnManagement) {
-        return AjaxResult.success(documentationReturnManagementMapper.listPage(page, documentationReturnManagement));
+    public R<?> listPageReturn(Page page, DocumentationReturnManagement documentationReturnManagement) {
+        return R.ok(documentationReturnManagementMapper.listPage(page, documentationReturnManagement));
     }
     @GetMapping("/getByDocumentationId/{id}")
     @Operation(summary = "鏍规嵁涔︾睄id鏌ヨ鍊熼槄璁板綍")
     @Log(title = "鏍规嵁涔︾睄id鏌ヨ鍊熼槄璁板綍", businessType = BusinessType.OTHER)
-    public AjaxResult getByDocumentationId(@PathVariable Long id) {
-        return AjaxResult.success(documentationBorrowManagementService.selectByDocumentationId(id));
+    public R<?> getByDocumentationId(@PathVariable Long id) {
+        return R.ok(documentationBorrowManagementService.selectByDocumentationId(id));
     }
     @PostMapping("/add")
     @Operation(summary = "鏂囨。鍊熼槄绠$悊-鍊熼槄")
     @Log(title = "鏂囨。鍊熼槄绠$悊-鍊熼槄", businessType = BusinessType.INSERT)
-    public AjaxResult add(@RequestBody DocumentationBorrowManagement documentationBorrowManagement) {
-        return AjaxResult.success(documentationBorrowManagementService.add(documentationBorrowManagement));
+    public R<?> add(@RequestBody DocumentationBorrowManagement documentationBorrowManagement) {
+        return R.ok(documentationBorrowManagementService.add(documentationBorrowManagement));
     }
     @PutMapping("/revent")
     @Operation(summary = "鏂囨。鍊熼槄绠$悊-褰掕繕")
     @Log(title = "鏂囨。鍊熼槄绠$悊-褰掕繕", businessType = BusinessType.UPDATE)
-    public AjaxResult revent(@RequestBody DocumentationReturnManagement documentationReturnManagement) {
-        return AjaxResult.success(documentationBorrowManagementService.reventdbm(documentationReturnManagement));
+    public R<?> revent(@RequestBody DocumentationReturnManagement documentationReturnManagement) {
+        return R.ok(documentationBorrowManagementService.reventdbm(documentationReturnManagement));
     }
     @PutMapping("/update")
     @Operation(summary = "鏂囨。鍊熼槄绠$悊-鏇存柊")
     @Log(title = "鏂囨。鍊熼槄绠$悊-鏇存柊", businessType = BusinessType.UPDATE)
-    public AjaxResult update(@RequestBody DocumentationBorrowManagement documentationBorrowManagement) {
-        return AjaxResult.success(documentationBorrowManagementService.updateById(documentationBorrowManagement));
+    public R<?> update(@RequestBody DocumentationBorrowManagement documentationBorrowManagement) {
+        return R.ok(documentationBorrowManagementService.updateById(documentationBorrowManagement));
     }
     @PutMapping("/reventUpdate")
     @Operation(summary = "鏂囨。鍊熼槄绠$悊-褰掕繕鏇存柊")
     @Log(title = "鏂囨。鍊熼槄绠$悊-褰掕繕鏇存柊", businessType = BusinessType.UPDATE)
-    public AjaxResult reventupdate(@RequestBody DocumentationReturnManagement documentationReturnManagement) {
-        return AjaxResult.success(documentationReturnManagementMapper.updateById(documentationReturnManagement));
+    public R<?> reventupdate(@RequestBody DocumentationReturnManagement documentationReturnManagement) {
+        return R.ok(documentationReturnManagementMapper.updateById(documentationReturnManagement));
     }
     @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(documentationBorrowManagementService.deleteByIds(ids));
+    public R<?> delete(@RequestBody List<Long> ids) {
+        if(CollectionUtils.isEmpty(ids)) return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        return R.ok(documentationBorrowManagementService.deleteByIds(ids));
     }
     @DeleteMapping ("/reventDelete")
     @Operation(summary = "鏂囨。鍊熼槄绠$悊-褰掕繕鍒犻櫎")
     @Log(title = "鏂囨。鍊熼槄绠$悊-褰掕繕鍒犻櫎", businessType = BusinessType.DELETE)
-    public AjaxResult reventdelete(@RequestBody List<Long> ids) {
-        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
-        return AjaxResult.success(documentationBorrowManagementService.reventDeleteByIds(ids));
+    public R<?> reventdelete(@RequestBody List<Long> ids) {
+        if(CollectionUtils.isEmpty(ids)) return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        return R.ok(documentationBorrowManagementService.reventDeleteByIds(ids));
     }
     @PostMapping("/export")
     @Operation(summary = "鏂囨。鍊熼槄绠$悊-鍊熼槄瀵煎嚭")
diff --git a/src/main/java/com/ruoyi/warehouse/controller/DocumentationController.java b/src/main/java/com/ruoyi/warehouse/controller/DocumentationController.java
index 427396b..614c62e 100644
--- a/src/main/java/com/ruoyi/warehouse/controller/DocumentationController.java
+++ b/src/main/java/com/ruoyi/warehouse/controller/DocumentationController.java
@@ -6,7 +6,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.warehouse.dto.DocumentationDto;
 import com.ruoyi.warehouse.pojo.Documentation;
 import com.ruoyi.warehouse.service.DocumentationService;
@@ -30,39 +30,39 @@
     @GetMapping("/listPage")
     @Operation(summary = "鏂囨。淇℃伅琛�-鍒嗛〉鏌ヨ")
     @Log(title = "鏂囨。淇℃伅琛�-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
-    public AjaxResult listPage(Page page, Documentation documentation) {
+    public R<?> listPage(Page page, Documentation documentation) {
         IPage<DocumentationDto> list = documentationService.listPage(page, documentation);
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
 
     @GetMapping("/list")
     @Operation(summary = "鏂囨。淇℃伅琛ㄦ煡璇�")
     @Log(title = "鏂囨。淇℃伅琛ㄦ煡璇�", businessType = BusinessType.OTHER)
-    public AjaxResult list() {
+    public R<?> list() {
         List<DocumentationDto> list = documentationService.listAll();
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
 
     @PostMapping("/add")
     @Operation(summary = "鏂囨。淇℃伅琛�-娣诲姞")
     @Log(title = "鏂囨。淇℃伅琛�-娣诲姞", businessType = BusinessType.INSERT)
-    public AjaxResult add(@RequestBody Documentation documentation) {
-        return AjaxResult.success(documentationService.save(documentation));
+    public R<?> add(@RequestBody Documentation documentation) {
+        return R.ok(documentationService.save(documentation));
     }
 
     @PutMapping("/update")
     @Operation(summary = "鏂囨。淇℃伅琛�-鏇存柊")
     @Log(title = "鏂囨。淇℃伅琛�-鏇存柊", businessType = BusinessType.UPDATE)
-    public AjaxResult update(@RequestBody Documentation documentation) {
-        return AjaxResult.success(documentationService.updateById(documentation));
+    public R<?> update(@RequestBody Documentation documentation) {
+        return R.ok(documentationService.updateById(documentation));
     }
 
     @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(documentationService.deleteByIds(ids));
+    public R<?> delete(@RequestBody List<Long> ids) {
+        if (CollectionUtils.isEmpty(ids)) return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        return R.ok(documentationService.deleteByIds(ids));
     }
 
     @PostMapping("/export")
@@ -74,24 +74,24 @@
 
     @Operation(summary = "鏂囨。淇℃伅琛�-缁熻")
     @GetMapping("/overview")
-    public AjaxResult getOverviewStatistics() {
+    public R<?> getOverviewStatistics() {
         Map<String, Object> result = new HashMap<>();
         result.put("totalDocsCount", documentationService.getTotalDocsCount());
         result.put("categoryNumCount", documentationService.getCategoryNumCount());
         result.put("borrowedDocsCount", documentationService.getBorrowedDocsCount());
         result.put("monthlyAddedDocsCount", documentationService.getMonthlyAddedDocsCount());
-        return AjaxResult.success(result);
+        return R.ok(result);
     }
 
     @Operation(summary = "鏂囨。淇℃伅琛�-鍒嗙被缁熻")
     @GetMapping("/category")
-    public AjaxResult getCategoryDistribution() {
-        return AjaxResult.success(documentationService.getCategoryDistribution());
+    public R<?> getCategoryDistribution() {
+        return R.ok(documentationService.getCategoryDistribution());
     }
 
     @Operation(summary = "鏂囨。淇℃伅琛�-鐘舵�佺粺璁�")
     @GetMapping("/status")
-    public AjaxResult getStatusDistribution() {
-        return AjaxResult.success(documentationService.getStatusDistribution());
+    public R<?> getStatusDistribution() {
+        return R.ok(documentationService.getStatusDistribution());
     }
 }
diff --git a/src/main/java/com/ruoyi/warehouse/controller/DocumentationFileController.java b/src/main/java/com/ruoyi/warehouse/controller/DocumentationFileController.java
index 9c8517e..6ec0e54 100644
--- a/src/main/java/com/ruoyi/warehouse/controller/DocumentationFileController.java
+++ b/src/main/java/com/ruoyi/warehouse/controller/DocumentationFileController.java
@@ -3,7 +3,8 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.account.pojo.AccountFile;
 import com.ruoyi.account.service.AccountFileService;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.warehouse.pojo.DocumentationFile;
 import com.ruoyi.warehouse.service.DocumentationFileService;
 import org.springframework.util.CollectionUtils;
@@ -17,7 +18,7 @@
  */
 @RestController
 @RequestMapping("/documentation/documentationFile")
-public class DocumentationFileController {
+public class DocumentationFileController extends BaseController {
 
 
     @Resource
@@ -29,8 +30,8 @@
      * @return
      */
     @PostMapping("/add")
-    public AjaxResult add(@RequestBody DocumentationFile documentationFile) {
-        return AjaxResult.success(documentationFileService.save(documentationFile));
+    public R<?> add(@RequestBody DocumentationFile documentationFile) {
+        return R.ok(documentationFileService.save(documentationFile));
     }
 
     /**
@@ -39,12 +40,12 @@
      * @return
      */
     @DeleteMapping("/del")
-    public AjaxResult delDocumentationFile(@RequestBody List<Long> ids) {
+    public R<?> delDocumentationFile(@RequestBody List<Long> ids) {
         if(CollectionUtils.isEmpty(ids)){
-            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+            return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         }
         //鍒犻櫎妫�楠岄檮浠�
-        return AjaxResult.success(documentationFileService.removeBatchByIds(ids));
+        return R.ok(documentationFileService.removeBatchByIds(ids));
     }
 
     /**
@@ -54,8 +55,8 @@
      * @return
      */
     @GetMapping("/listPage")
-    public AjaxResult documentationFileListPage(DocumentationFile documentationFile) {
-        return AjaxResult.success(documentationFileService.documentationFileListPage( documentationFile));
+    public R<?> documentationFileListPage(DocumentationFile documentationFile) {
+        return R.ok(documentationFileService.documentationFileListPage( documentationFile));
     }
 
 
diff --git a/src/main/java/com/ruoyi/warehouse/controller/WarehouseController.java b/src/main/java/com/ruoyi/warehouse/controller/WarehouseController.java
index 7d80dd1..f8b6f96 100644
--- a/src/main/java/com/ruoyi/warehouse/controller/WarehouseController.java
+++ b/src/main/java/com/ruoyi/warehouse/controller/WarehouseController.java
@@ -4,7 +4,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.warehouse.pojo.Warehouse;
 import com.ruoyi.warehouse.service.WarehouseService;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -25,36 +25,36 @@
     @GetMapping("/tree")
     @Operation(summary = "浠撳簱-鏌ヨ鏍�")
     @Log(title = "浠撳簱-鏌ヨ鏍�", businessType = BusinessType.OTHER)
-    public AjaxResult listTree() {
-        return AjaxResult.success(warehouseService.findListTree());
+    public R<?> listTree() {
+        return R.ok(warehouseService.findListTree());
     }
 
     @GetMapping("/list")
     @Operation(summary = "浠撳簱-鏌ヨ")
     @Log(title = "浠撳簱-鏌ヨ", businessType = BusinessType.OTHER)
-    public AjaxResult list(Warehouse warehouse) {
-        return AjaxResult.success(warehouseService.findList(warehouse));
+    public R<?> list(Warehouse warehouse) {
+        return R.ok(warehouseService.findList(warehouse));
     }
 
     @PostMapping("/add")
     @Operation(summary = "浠撳簱-娣诲姞")
     @Log(title = "浠撳簱-娣诲姞", businessType = BusinessType.INSERT)
-    public AjaxResult add(@RequestBody Warehouse warehouse) {
-        return AjaxResult.success(warehouseService.save(warehouse));
+    public R<?> add(@RequestBody Warehouse warehouse) {
+        return R.ok(warehouseService.save(warehouse));
     }
 
     @PutMapping("/update")
     @Operation(summary = "浠撳簱-鏇存柊")
     @Log(title = "浠撳簱-鏇存柊", businessType = BusinessType.UPDATE)
-    public AjaxResult update(@RequestBody Warehouse warehouse) {
-        return AjaxResult.success(warehouseService.updateById(warehouse));
+    public R<?> update(@RequestBody Warehouse warehouse) {
+        return R.ok(warehouseService.updateById(warehouse));
     }
 
     @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(warehouseService.deleteByIds(ids));
+    public R<?> delete(@RequestBody List<Long> ids) {
+        if (CollectionUtils.isEmpty(ids)) return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        return R.ok(warehouseService.deleteByIds(ids));
     }
 }
diff --git a/src/main/java/com/ruoyi/warehouse/controller/WarehouseGoodsShelvesController.java b/src/main/java/com/ruoyi/warehouse/controller/WarehouseGoodsShelvesController.java
index 5aebb76..644cea9 100644
--- a/src/main/java/com/ruoyi/warehouse/controller/WarehouseGoodsShelvesController.java
+++ b/src/main/java/com/ruoyi/warehouse/controller/WarehouseGoodsShelvesController.java
@@ -4,7 +4,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.warehouse.dto.WarehouseGoodsShelvesDto;
 import com.ruoyi.warehouse.pojo.WarehouseGoodsShelves;
 import com.ruoyi.warehouse.service.WarehouseGoodsShelvesService;
@@ -25,27 +25,27 @@
     @GetMapping("/listById")
     @Operation(summary = "鍟嗗搧璐ф灦-鏌ヨ")
     @Log(title = "鍟嗗搧璐ф灦-鏌ヨ", businessType = BusinessType.OTHER)
-    public AjaxResult listById(WarehouseGoodsShelves warehouseGoodsShelves) {
+    public R<?> listById(WarehouseGoodsShelves warehouseGoodsShelves) {
         List<WarehouseGoodsShelvesDto> list = warehouseGoodsShelvesService.findList(warehouseGoodsShelves);
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
     @PostMapping("/add")
     @Operation(summary = "鍟嗗搧璐ф灦-娣诲姞")
     @Log(title = "鍟嗗搧璐ф灦-娣诲姞", businessType = BusinessType.INSERT)
-    public AjaxResult add(@RequestBody WarehouseGoodsShelves warehouseGoodsShelves) {
-        return AjaxResult.success(warehouseGoodsShelvesService.add(warehouseGoodsShelves));
+    public R<?> add(@RequestBody WarehouseGoodsShelves warehouseGoodsShelves) {
+        return R.ok(warehouseGoodsShelvesService.add(warehouseGoodsShelves));
     }
     @PutMapping("/update")
     @Operation(summary = "鍟嗗搧璐ф灦-鏇存柊")
     @Log(title = "鍟嗗搧璐ф灦-鏇存柊", businessType = BusinessType.UPDATE)
-    public AjaxResult update(@RequestBody WarehouseGoodsShelves warehouseGoodsShelves) {
-        return AjaxResult.success(warehouseGoodsShelvesService.updateRowcolById(warehouseGoodsShelves));
+    public R<?> update(@RequestBody WarehouseGoodsShelves warehouseGoodsShelves) {
+        return R.ok(warehouseGoodsShelvesService.updateRowcolById(warehouseGoodsShelves));
     }
     @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(warehouseGoodsShelvesService.deleteByIds(ids));
+    public R<?> delete(@RequestBody List<Long> ids) {
+        if(CollectionUtils.isEmpty(ids)) return R.fail("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        return  R.ok(warehouseGoodsShelvesService.deleteByIds(ids));
     }
 }
diff --git a/src/main/java/com/ruoyi/warehouse/controller/WarehouseGoodsShelvesRowcolController.java b/src/main/java/com/ruoyi/warehouse/controller/WarehouseGoodsShelvesRowcolController.java
index ed3ed06..f9a4666 100644
--- a/src/main/java/com/ruoyi/warehouse/controller/WarehouseGoodsShelvesRowcolController.java
+++ b/src/main/java/com/ruoyi/warehouse/controller/WarehouseGoodsShelvesRowcolController.java
@@ -3,7 +3,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.warehouse.dto.WarehouseGoodsShelvesRowcolDto;
 import com.ruoyi.warehouse.pojo.WarehouseGoodsShelvesRowcol;
 import com.ruoyi.warehouse.service.WarehouseGoodsShelvesRowcolService;
@@ -26,10 +26,10 @@
     @GetMapping("/list")
     @Operation(summary = "鍟嗗搧璐ф灦琛屽垪-鏌ヨ")
     @Log(title = "鍟嗗搧璐ф灦琛屽垪-鏌ヨ", businessType = BusinessType.OTHER)
-    public AjaxResult list(WarehouseGoodsShelvesRowcol warehouseGoodsShelvesRowcol) {
+    public R<?> list(WarehouseGoodsShelvesRowcol warehouseGoodsShelvesRowcol) {
 
         List<WarehouseGoodsShelvesRowcolDto> list = warehouseGoodsShelvesRowcolService.getList(warehouseGoodsShelvesRowcol);
-        return AjaxResult.success(list);
+        return R.ok(list);
     }
 
 }
diff --git a/src/main/java/com/ruoyi/waterrecord/controller/WaterRecordController.java b/src/main/java/com/ruoyi/waterrecord/controller/WaterRecordController.java
index be3933b..b22de49 100644
--- a/src/main/java/com/ruoyi/waterrecord/controller/WaterRecordController.java
+++ b/src/main/java/com/ruoyi/waterrecord/controller/WaterRecordController.java
@@ -6,7 +6,7 @@
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.waterrecord.pojo.WaterRecord;
 import com.ruoyi.waterrecord.service.WaterRecordService;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -35,34 +35,34 @@
 
     @GetMapping("/listPage")
     @Log(title = "鐢ㄦ按绠$悊-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
-    public AjaxResult listPage(Page page, WaterRecord waterRecord){
+    public R<?> listPage(Page page, WaterRecord waterRecord){
         IPage<WaterRecord> listPage = waterRecordService.listPage(page, waterRecord);
-        return AjaxResult.success(listPage);
+        return R.ok(listPage);
     }
 
     @PostMapping("/add")
     @Log(title = "鐢ㄦ按绠$悊-鏂板", businessType = BusinessType.INSERT)
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult add(@RequestBody WaterRecord waterRecord){
+    public R<?> add(@RequestBody WaterRecord waterRecord){
         boolean save = waterRecordService.save(waterRecord);
-        return save ? AjaxResult.success() : AjaxResult.error();
+        return save ? R.ok() : R.fail();
     }
 
     @PostMapping("/update")
     @Log(title = "鐢ㄦ按绠$悊-淇敼", businessType = BusinessType.UPDATE)
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult update(@RequestBody WaterRecord waterRecord){
+    public R<?> update(@RequestBody WaterRecord waterRecord){
         boolean update = waterRecordService.updateById(waterRecord);
-        return update ? AjaxResult.success() : AjaxResult.error();
+        return update ? R.ok() : R.fail();
     }
 
     @DeleteMapping("/delete")
     @Log(title = "鐢ㄦ按绠$悊-鍒犻櫎", businessType = BusinessType.DELETE)
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult delete(@RequestBody List<Long> ids){
-        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+    public R<?> delete(@RequestBody List<Long> ids){
+        if(CollectionUtils.isEmpty(ids)) return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         boolean delete = waterRecordService.removeBatchByIds(ids);
-        return delete ? AjaxResult.success() : AjaxResult.error();
+        return delete ? R.ok() : R.fail();
     }
 
     /**
@@ -71,7 +71,7 @@
     @Log(title = "瀵煎叆鐢ㄦ按绠$悊", businessType = BusinessType.IMPORT)
     @PostMapping("/importData")
     @Operation(summary = "瀵煎叆鐢ㄦ按绠$悊")
-    public AjaxResult importData(MultipartFile file) throws Exception {
+    public R<?> importData(MultipartFile file) throws Exception {
         return waterRecordService.importData(file);
     }
 
diff --git a/src/main/java/com/ruoyi/waterrecord/service/WaterRecordService.java b/src/main/java/com/ruoyi/waterrecord/service/WaterRecordService.java
index 775fb25..879610c 100644
--- a/src/main/java/com/ruoyi/waterrecord/service/WaterRecordService.java
+++ b/src/main/java/com/ruoyi/waterrecord/service/WaterRecordService.java
@@ -3,7 +3,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.waterrecord.pojo.WaterRecord;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -21,5 +21,5 @@
      */
     IPage<WaterRecord> listPage(Page page, WaterRecord waterRecord);
 
-    AjaxResult importData(MultipartFile file);
+    R<?> importData(MultipartFile file);
 }
diff --git a/src/main/java/com/ruoyi/waterrecord/service/impl/WaterRecordServiceImpl.java b/src/main/java/com/ruoyi/waterrecord/service/impl/WaterRecordServiceImpl.java
index 09604bc..b1c32b4 100644
--- a/src/main/java/com/ruoyi/waterrecord/service/impl/WaterRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/waterrecord/service/impl/WaterRecordServiceImpl.java
@@ -4,7 +4,8 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.common.constant.HttpStatus;
+import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.waterrecord.mapper.WaterRecordMapper;
 import com.ruoyi.waterrecord.pojo.WaterRecord;
 import com.ruoyi.waterrecord.service.WaterRecordService;
@@ -34,18 +35,18 @@
     }
 
     @Override
-    public AjaxResult importData(MultipartFile file) {
+    public R<?> importData(MultipartFile file) {
         try {
             ExcelUtil<WaterRecord> util = new ExcelUtil<WaterRecord>(WaterRecord.class);
             List<WaterRecord> userList = util.importExcel(file.getInputStream());
             if(CollectionUtils.isEmpty(userList)){
-                return AjaxResult.warn("妯℃澘閿欒鎴栧鍏ユ暟鎹负绌�");
+                return R.fail(HttpStatus.WARN, "妯℃澘閿欒鎴栧鍏ユ暟鎹负绌�");
             }
             this.saveOrUpdateBatch(userList);
-            return AjaxResult.success(true);
+            return R.ok(true);
         }catch (Exception e){
             e.printStackTrace();
-            return AjaxResult.error("瀵煎叆澶辫触");
+            return R.fail("瀵煎叆澶辫触");
         }
     }
 }
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 3e16326..86a0846 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -268,4 +268,3 @@
   compressQuality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
 knowledge:
   one: D:\鏂扮枂澶х綏绱犱紒涓氫骇鍝佷綋绯昏鏄庢枃妗�.md
-
diff --git a/src/main/resources/approve-todo-agent-prompt.txt b/src/main/resources/approve-todo-agent-prompt.txt
index c309da8..f026fee 100644
--- a/src/main/resources/approve-todo-agent-prompt.txt
+++ b/src/main/resources/approve-todo-agent-prompt.txt
@@ -1,4 +1,5 @@
 浣犳槸涓�涓鎵瑰緟鍔炲姪鎵嬶紝璐熻矗鍗忓悓鍔炲叕瀹℃壒寰呭姙鐨勬煡璇€�佸鏍搞�佸彇娑堝鏍搞�佷慨鏀广�佸垹闄ゅ拰缁熻鍒嗘瀽銆�
+褰撳墠鏃ユ湡锛歿{currentDate}}锛堜腑鍥芥椂鍖猴級銆�
 
 宸ヤ綔瑕佹眰锛�
 1. 鐢ㄦ埛闂緟鍔炲垪琛ㄣ�佸鎵硅繘搴︺�佸鎵硅鎯呫�佺粺璁℃暟鎹椂锛屼紭鍏堣皟鐢ㄥ伐鍏凤紝涓嶈鑷嗛�犳暟鎹��
@@ -16,3 +17,4 @@
 13. 鍙湁鈥滄煡璇㈠鎵瑰緟鍔炶鎯呪�濊繖涓伐鍏峰厑璁歌緭鍑鸿嚜鐒惰瑷�鏂囨湰銆�
 14. 濡傛灉宸ュ叿杩斿洖鐨勬槸缁熻 JSON锛屼篃鍚屾牱鐩存帴杈撳嚭鍘熷 JSON锛涘叾涓� `description`銆乣summary`銆乣charts` 宸茬粡渚涘墠绔娇鐢ㄣ��
 15. 鍥炵瓟浣跨敤涓枃锛涗絾鍦� JSON 鍦烘櫙涓嬶紝鏈�缁堣緭鍑哄繀椤绘槸鍚堟硶 JSON 鏈綋銆�
+16. 鐢ㄦ埛鎻愬埌鈥滀粖骞�/鏈湀/浠婂ぉ/鏈�杩�/涓婃湀/鍘诲勾鈥濈瓑鐩稿鏃堕棿鏃讹紝蹇呴』涓ユ牸鍩轰簬鈥滃綋鍓嶆棩鏈熲�濇崲绠楋紝绂佹鑷鍋囪骞翠唤銆�
diff --git a/src/main/resources/manufacturing-agent-prompt.txt b/src/main/resources/manufacturing-agent-prompt.txt
index c1a30c8..1653bb9 100644
--- a/src/main/resources/manufacturing-agent-prompt.txt
+++ b/src/main/resources/manufacturing-agent-prompt.txt
@@ -1,4 +1,5 @@
 浣犳槸浼佷笟鍒堕�犳櫤鑳藉姪鎵嬶紝瑕嗙洊鐢熶骇鐜板満銆佽鍒掋�佸伐鍗曘�佽澶囥�佽川閲忋�佺墿鏂欍�佸紓甯稿鐞嗕竷涓煙銆�
+褰撳墠鏃ユ湡锛歿{currentDate}}锛堜腑鍥芥椂鍖猴級銆�
 
 宸ヤ綔瑙勫垯锛�
 1. 鐢ㄦ埛鎻愬嚭鈥滄煡銆侀棶銆侀璀︺�佸垎鏋愨�濋渶姹傛椂锛屼紭鍏堣皟鐢ㄥ伐鍏锋嬁缁撴瀯鍖栫粨鏋滐紝涓嶈鑷嗛�犱笟鍔℃暟鎹��
@@ -6,3 +7,4 @@
 3. 宸ュ叿杩斿洖 JSON 鏃讹紝鐩存帴杈撳嚭鍘熷 JSON 瀛楃涓诧紝涓嶈棰濆鍖呰9 Markdown锛屼笉瑕佸湪鍓嶅悗鍔犺В閲婃枃瀛椼��
 4. 鍥炵瓟蹇呴』浣跨敤涓枃锛涜嫢鐢ㄦ埛闂缂哄皯鏃堕棿鑼冨洿銆佸叧閿瓧绛夋潯浠讹紝鍙厛缁欓粯璁ゅ彛寰勫苟鎻愮ず鍙ˉ鍏呮潯浠躲��
 5. 鑻ユ棤娉曚粠宸ュ叿缁撴灉寰楀埌缁撹锛屾槑纭鏄庣己灏戠殑绛涢�夋潯浠舵垨涓氬姟瀛楁銆�
+6. 鐢ㄦ埛鎻愬埌鈥滀粖骞�/鏈湀/浠婂ぉ/鏈�杩�/涓婃湀/鍘诲勾鈥濈瓑鐩稿鏃堕棿鏃讹紝蹇呴』涓ユ牸鍩轰簬鈥滃綋鍓嶆棩鏈熲�濇崲绠楋紝绂佹鑷鍋囪骞翠唤銆�
diff --git a/src/main/resources/mapper/account/AccountSubjectMapper.xml b/src/main/resources/mapper/account/financial/AccountSubjectMapper.xml
similarity index 88%
rename from src/main/resources/mapper/account/AccountSubjectMapper.xml
rename to src/main/resources/mapper/account/financial/AccountSubjectMapper.xml
index 95f450f..469691f 100644
--- a/src/main/resources/mapper/account/AccountSubjectMapper.xml
+++ b/src/main/resources/mapper/account/financial/AccountSubjectMapper.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.ruoyi.account.mapper.AccountSubjectMapper">
+<mapper namespace="com.ruoyi.account.mapper.financial.AccountSubjectMapper">
 
     <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
-    <resultMap id="BaseResultMap" type="com.ruoyi.account.pojo.AccountSubject">
+    <resultMap id="BaseResultMap" type="com.ruoyi.account.pojo.financial.AccountSubject">
         <id column="id" property="id" />
         <result column="parent_id" property="parentId" />
         <result column="subject_code" property="subjectCode" />
diff --git a/src/main/resources/mapper/basic/CustomerMapper.xml b/src/main/resources/mapper/basic/CustomerMapper.xml
index 20aaefc..b2546d7 100644
--- a/src/main/resources/mapper/basic/CustomerMapper.xml
+++ b/src/main/resources/mapper/basic/CustomerMapper.xml
@@ -26,7 +26,6 @@
         from customer c
         left join sys_user u on c.usage_user = u.user_id
         <where>
-            and c.usage_status = 1
             <if test="c.customerName != null and c.customerName != ''">
                 and customer_name like concat('%', #{c.customerName}, '%')
             </if>
diff --git a/src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml b/src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml
index d348a6b..500846b 100644
--- a/src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml
+++ b/src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml
@@ -53,7 +53,7 @@
                  left join sales_ledger sl on si.sales_ledger_id = sl.id
         where rm.id = #{id}
     </select>
-    <select id="listPageAccountSalesReturn" resultType="com.ruoyi.account.bean.vo.SalesReturnVo">
+    <select id="listPageAccountSalesReturn" resultType="com.ruoyi.account.bean.vo.sales.SalesReturnVo">
          select rm.id,
                 rm.return_no,
                 c.customer_name,
diff --git a/src/main/resources/mapper/production/ProductionOperationTaskMapper.xml b/src/main/resources/mapper/production/ProductionOperationTaskMapper.xml
index f029ef7..199eb21 100644
--- a/src/main/resources/mapper/production/ProductionOperationTaskMapper.xml
+++ b/src/main/resources/mapper/production/ProductionOperationTaskMapper.xml
@@ -64,6 +64,9 @@
             <if test="c != null and c.status != null">
                 and pot.status = #{c.status}
             </if>
+            <if test="c != null and c.isProduction != null">
+                and poro.is_production = #{c.isProduction}
+            </if>
             <if test="c != null and c.workOrderNo != null and c.workOrderNo != ''">
                 and pot.work_order_no like concat('%', #{c.workOrderNo}, '%')
             </if>
diff --git a/src/main/resources/mapper/production/ProductionOrderMapper.xml b/src/main/resources/mapper/production/ProductionOrderMapper.xml
index 1a304ef..8e64413 100644
--- a/src/main/resources/mapper/production/ProductionOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductionOrderMapper.xml
@@ -212,4 +212,85 @@
           and ifnull(complete_quantity, 0) &lt; quantity
     </select>
 
+    <select id="selectHomeOrderProgressPage" resultType="java.util.Map">
+        select po.nps_no as orderNo,
+               p.product_name as productName,
+               ifnull(po.quantity, 0) as plannedQuantity,
+               ifnull(po.complete_quantity, 0) as completedQuantity,
+               round(ifnull(po.complete_quantity, 0) / nullif(po.quantity, 0) * 100, 2) as completionRate,
+               po.plan_complete_time as dueDate,
+               po.status as status
+        from production_order po
+                 left join product_model pm on po.product_model_id = pm.id
+                 left join product p on pm.product_id = p.id
+        <where>
+            <if test="status != null">
+                and po.status = #{status}
+            </if>
+            <if test="startTime != null and endTime != null">
+                and po.create_time &gt;= #{startTime}
+                and po.create_time &lt; #{endTime}
+            </if>
+        </where>
+        order by po.id desc
+        limit #{offset}, #{size}
+    </select>
+
+    <select id="countHomeOrderProgress" resultType="java.lang.Long">
+        select count(1)
+        from production_order po
+        <where>
+            <if test="status != null">
+                and po.status = #{status}
+            </if>
+            <if test="startTime != null and endTime != null">
+                and po.create_time &gt;= #{startTime}
+                and po.create_time &lt; #{endTime}
+            </if>
+        </where>
+    </select>
+
+    <select id="countHomeOrderProgressByStatus" resultType="java.util.Map">
+        select po.status as status, count(1) as cnt
+        from production_order po
+        where po.status in (1, 2, 3, 4)
+        <if test="startTime != null and endTime != null">
+            and po.create_time &gt;= #{startTime}
+            and po.create_time &lt; #{endTime}
+        </if>
+        group by po.status
+    </select>
+
+    <select id="selectHomeTodayProductionPlan" resultType="java.util.Map">
+        select po.nps_no as orderNo,
+               p.product_name as productName,
+               ifnull(po.quantity, 0) as plannedQuantity,
+               po.plan_complete_time as dueDate,
+               po.status as status
+        from production_order po
+                 left join product_model pm on po.product_model_id = pm.id
+                 left join product p on pm.product_id = p.id
+        <where>
+            po.status in (1, 2)
+            <if test="planStart != null and planEnd != null">
+                and po.plan_complete_time &gt;= #{planStart}
+                and po.plan_complete_time &lt; #{planEnd}
+            </if>
+        </where>
+        order by case when po.status = 2 then 0 else 1 end, po.id desc
+        limit #{size}
+    </select>
+
+    <select id="countHomeTodayProductionPlan" resultType="java.lang.Long">
+        select count(1)
+        from production_order po
+        <where>
+            po.status in (1, 2)
+            <if test="planStart != null and planEnd != null">
+                and po.plan_complete_time &gt;= #{planStart}
+                and po.plan_complete_time &lt; #{planEnd}
+            </if>
+        </where>
+    </select>
+
 </mapper>
diff --git a/src/main/resources/mapper/purchase/PurchaseReturnOrdersMapper.xml b/src/main/resources/mapper/purchase/PurchaseReturnOrdersMapper.xml
index 6732a66..961d783 100644
--- a/src/main/resources/mapper/purchase/PurchaseReturnOrdersMapper.xml
+++ b/src/main/resources/mapper/purchase/PurchaseReturnOrdersMapper.xml
@@ -54,7 +54,7 @@
         where pro.id = #{id}
     </select>
     <select id="listPageAccountPurchaseReturn"
-            resultType="com.ruoyi.account.bean.vo.PurchaseReturnVo">
+            resultType="com.ruoyi.account.bean.vo.purchase.PurchaseReturnVo">
          select pro.id,
                 pro.no returnNo,
                 t.inboundBatches,
diff --git a/src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml b/src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml
index 5bda4f6..49380aa 100644
--- a/src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml
+++ b/src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml
@@ -84,7 +84,7 @@
                 ELSE false
                 END AS method
         FROM quality_unqualified qu
-                 LEFT JOIN product_model pm ON qu.model = pm.id
+                 LEFT JOIN product_model pm ON qu.product_model_id = pm.id
         where
             1=1
         and qu.id = #{id}
diff --git a/src/main/resources/mapper/stock/StockInRecordMapper.xml b/src/main/resources/mapper/stock/StockInRecordMapper.xml
index 579a464..55e57a3 100644
--- a/src/main/resources/mapper/stock/StockInRecordMapper.xml
+++ b/src/main/resources/mapper/stock/StockInRecordMapper.xml
@@ -31,6 +31,12 @@
             <if test="params.productName != null and params.productName != ''">
                 and p.product_name like concat('%',#{params.productName},'%')
             </if>
+            <if test="params.model != null and params.model != ''">
+                and pm.model like concat('%',#{params.model},'%')
+            </if>
+            <if test="params.batchNo != null and params.batchNo != ''">
+                and sir.batch_no like concat('%',#{params.batchNo},'%')
+            </if>
             <if test="params.type != null and params.type != ''">
                 and sir.type = #{params.type}
             </if>
@@ -70,7 +76,7 @@
         </where>
         order by sir.id desc
     </select>
-    <select id="listPageAccountPurchase" resultType="com.ruoyi.account.bean.vo.PurchaseInboundVo">
+    <select id="listPageAccountPurchase" resultType="com.ruoyi.account.bean.vo.purchase.PurchaseInboundVo">
         SELECT
             sir.id,
             sir.inbound_batches,
diff --git a/src/main/resources/mapper/stock/StockInventoryMapper.xml b/src/main/resources/mapper/stock/StockInventoryMapper.xml
index c71ce31..428e8da 100644
--- a/src/main/resources/mapper/stock/StockInventoryMapper.xml
+++ b/src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -209,6 +209,12 @@
             <if test="ew.topParentProductId != null and ew.topParentProductId > 0">
                 and combined.product_id in (select id from product_tree)
             </if>
+            <if test="ew.model != null and ew.model !=''">
+                and combined.model like concat('%',#{ew.model},'%')
+            </if>
+            <if test="ew.batchNo != null and ew.batchNo !=''">
+                and combined.batch_no like concat('%',#{ew.batchNo},'%')
+            </if>
         </where>
         group by
         product_model_id,
diff --git a/src/main/resources/mapper/stock/StockOutRecordMapper.xml b/src/main/resources/mapper/stock/StockOutRecordMapper.xml
index 35421c9..202de6b 100644
--- a/src/main/resources/mapper/stock/StockOutRecordMapper.xml
+++ b/src/main/resources/mapper/stock/StockOutRecordMapper.xml
@@ -46,6 +46,12 @@
             <if test="params.productName != null and params.productName != ''">
                 and p.product_name like concat('%',#{params.productName},'%')
             </if>
+            <if test="params.model != null and params.model != ''">
+                and pm.model like concat('%',#{params.model},'%')
+            </if>
+            <if test="params.batchNo != null and params.batchNo != ''">
+                and sor.batch_no like concat('%',#{params.batchNo},'%')
+            </if>
             <if test="params.type != null and params.type != ''">
                 and sor.type = #{params.type}
             </if>
@@ -86,7 +92,7 @@
         order by sor.id desc
     </select>
 
-    <select id="listPageAccountSales" resultType="com.ruoyi.account.bean.vo.SalesOutboundVo">
+    <select id="listPageAccountSales" resultType="com.ruoyi.account.bean.vo.sales.SalesOutboundVo">
     SELECT
         sor.id,
         sor.outbound_batches,
diff --git a/src/main/resources/purchase-agent-prompt.txt b/src/main/resources/purchase-agent-prompt.txt
index 97f7eb2..2fd5021 100644
--- a/src/main/resources/purchase-agent-prompt.txt
+++ b/src/main/resources/purchase-agent-prompt.txt
@@ -1,5 +1,6 @@
 浣犳槸浼佷笟閲囪喘鏅鸿兘鍔╃悊銆�
 浣犵殑鐩爣鏄府鍔╃敤鎴峰揩閫熷畬鎴愰噰璐浉鍏充俊鎭煡璇笌瑙h銆�
+褰撳墠鏃ユ湡锛歿{currentDate}}锛堜腑鍥芥椂鍖猴級銆�
 
 宸ヤ綔瑙勫垯锛�
 1. 浼樺厛璋冪敤宸ュ叿鍑芥暟鑾峰彇閲囪喘鍙拌处銆佷粯娆俱�佸彂绁ㄣ�侀��璐х瓑缁撴瀯鍖栨暟鎹��
@@ -9,6 +10,8 @@
 5. 鐢ㄦ埛闂�滄渶杩�7澶╀緵搴斿晢鍒拌揣寮傚父鈥濃�滃埌璐ч棶棰樷�濃�滃埌璐у紓甯糕�濇椂锛岃皟鐢ㄢ�滄煡璇㈤噰璐埌璐у紓甯糕�濄��
 6. 鐢ㄦ埛闂�滃緟浠樻閲囪喘鍗曗�濃�滄湭浠樻閲囪喘鍗曗�濃�滄湭浠樻竻閲囪喘璁㈠崟鈥濇椂锛岃皟鐢ㄢ�滄煡璇㈠緟浠樻閲囪喘鍗曗�濄��
 7. 鐢ㄦ埛闂�滄湰鏈堥噰璐��璐ф儏鍐碘�濃�滈噰璐��璐у垪琛ㄢ�濃�滈��鏂�/鎷掓敹鎯呭喌鈥濇椂锛岃皟鐢ㄢ�滄煡璇㈤噰璐��璐ф儏鍐碘�濄��
-8. 缁撴灉鐢ㄧ畝娲佷腑鏂囧洖绛旓紝鍏堢粰缁撹锛屽啀缁欏叧閿暟鎹偣銆�
-9. 涓嶈缂栭�犻噰璐暟鎹紝鎵�鏈夌粨璁哄繀椤诲熀浜庡伐鍏疯繑鍥炪��
-10. 鏃犳硶鐩存帴寰楀嚭缁撹鏃讹紝鏄庣‘璇存槑缂哄皯鍝簺瀛楁鎴栫瓫閫夋潯浠躲��
+8. 宸ュ叿杩斿洖 JSON 鏃讹紝鐩存帴杈撳嚭鍘熷 JSON 瀛楃涓诧紝涓嶈棰濆鍖呰9 Markdown锛屼篃涓嶈鍦ㄥ墠鍚庤拷鍔犺В閲婃枃鏈��
+9. 鍙湁鍦ㄦ湭璋冪敤 JSON 宸ュ叿鏃讹紝鎵嶄娇鐢ㄧ畝娲佷腑鏂囧洖绛旓紝鍏堢粰缁撹锛屽啀缁欏叧閿暟鎹偣銆�
+10. 涓嶈缂栭�犻噰璐暟鎹紝鎵�鏈夌粨璁哄繀椤诲熀浜庡伐鍏疯繑鍥炪��
+11. 鏃犳硶鐩存帴寰楀嚭缁撹鏃讹紝鏄庣‘璇存槑缂哄皯鍝簺瀛楁鎴栫瓫閫夋潯浠躲��
+12. 鐢ㄦ埛鎻愬埌鈥滀粖骞�/鏈湀/浠婂ぉ/鏈�杩�/涓婃湀/鍘诲勾鈥濈瓑鐩稿鏃堕棿鏃讹紝蹇呴』涓ユ牸鍩轰簬鈥滃綋鍓嶆棩鏈熲�濇崲绠楋紝绂佹鑷鍋囪骞翠唤銆�
diff --git a/src/main/resources/sales-agent-prompt.txt b/src/main/resources/sales-agent-prompt.txt
new file mode 100644
index 0000000..3a43502
--- /dev/null
+++ b/src/main/resources/sales-agent-prompt.txt
@@ -0,0 +1,9 @@
+浣犳槸浼佷笟閿�鍞姪鎵嬶紝瑕嗙洊瀹㈡埛妗f銆侀攢鍞姤浠枫�侀攢鍞彴璐︺�侀攢鍞��璐с�佸鎴峰線鏉ャ�佸彂璐у彴璐︺�佹寚鏍囩粺璁°�佸鎴锋祦澶遍闄╁垎鏋愩�佸洖娆句笌鎶ヤ环绛栫暐寤鸿绛夊満鏅��
+褰撳墠鏃ユ湡锛歿{currentDate}}锛堜腑鍥芥椂鍖猴級銆�
+宸ヤ綔瑙勫垯锛�
+1. 鐢ㄦ埛鎻愬嚭鈥滄煡銆侀棶銆佺粺璁°�佸垎鏋愩�佸缓璁�濋渶姹傛椂锛屼紭鍏堣皟鐢ㄥ伐鍏疯繑鍥炵粨鏋勫寲鏁版嵁锛屼笉缂栭�犱笟鍔℃暟鎹��
+2. 鍛戒腑鈥滃鎴锋祦澶遍闄╁垎鏋愨�濇垨鈥滃洖娆句笌鎶ヤ环绛栫暐寤鸿鈥濇椂锛屼紭鍏堜娇鐢ㄥ伐鍏疯緭鍑虹粨鏋勫寲 JSON銆�
+3. 宸ュ叿杩斿洖 JSON 鏃讹紝鐩存帴杈撳嚭鍘熷 JSON 瀛楃涓诧紝涓嶈棰濆鍖呰9 Markdown锛屼篃涓嶈鍦ㄥ墠鍚庤拷鍔犺В閲婃枃鏈��
+4. 鍥炲蹇呴』浣跨敤涓枃锛涜嫢鐢ㄦ埛缂哄皯鏃堕棿鑼冨洿銆佸叧閿瘝绛夋潯浠讹紝鍙厛浣跨敤榛樿鍙e緞骞舵彁绀哄彲琛ュ厖鏉′欢銆�
+5. 鑻ユ暟鎹笉瓒充互寰楀嚭缁撹锛屾槑纭寚鍑虹己灏戠殑绛涢�夋潯浠舵垨鍏抽敭瀛楁銆�
+6. 鐢ㄦ埛鎻愬埌鈥滀粖骞�/鏈湀/浠婂ぉ/鏈�杩�/涓婃湀/鍘诲勾鈥濈瓑鐩稿鏃堕棿鏃讹紝蹇呴』涓ユ牸鍩轰簬鈥滃綋鍓嶆棩鏈熲�濇崲绠楋紝绂佹鑷鍋囪骞翠唤銆�
diff --git "a/src/main/resources/static/\351\224\200\345\224\256\345\217\260\350\264\246\345\257\274\345\205\245\346\250\241\346\235\277.xlsx" "b/src/main/resources/static/\351\224\200\345\224\256\345\217\260\350\264\246\345\257\274\345\205\245\346\250\241\346\235\277.xlsx"
index 9558711..0dad163 100644
--- "a/src/main/resources/static/\351\224\200\345\224\256\345\217\260\350\264\246\345\257\274\345\205\245\346\250\241\346\235\277.xlsx"
+++ "b/src/main/resources/static/\351\224\200\345\224\256\345\217\260\350\264\246\345\257\274\345\205\245\346\250\241\346\235\277.xlsx"
Binary files differ

--
Gitblit v1.9.3