已添加4个文件
已修改109个文件
2289 ■■■■ 文件已修改
.gitignore 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/20260523_新增入库记录表的预警数量.sql 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/update_after_sales_service.sql 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/aftersalesservice/pojo/AfterSalesService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/aftersalesservice/service/impl/AfterSalesServiceServiceImpl.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/ai/controller/FinancialAiController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/ai/controller/ManufacturingAiController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/ai/controller/PurchaseAiController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/ai/controller/SalesAiController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/ai/controller/XiaozhiController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/controller/ApproveProcessConfigNodeController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/controller/HolidaySettingsController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/controller/KnowledgeBaseController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/controller/NotificationManagementController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/controller/RpaProcessAutomationController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/controller/StorageAttachmentController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/controller/SupplierManageController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/controller/SupplierManageFileController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/controller/DutyPlanController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/controller/MeetingController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/controller/NoticeTypeController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementFileController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/controller/SealApplicationManagementController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/controller/StaffContactsPersonalController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/controller/DeviceDefectRecordController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/controller/DeviceMaintenanceFileController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/controller/DeviceRepairController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/controller/InspectionTaskController.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/controller/QrCodeController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/controller/QrCodeScanRecordController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/controller/TimingTaskController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsRequisitionRecordController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/officesupplies/controller/OfficeSuppliesController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/other/controller/PdaVersionController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/controller/GasTankWarningController.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/controller/InboundManagementController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementExceptionRecordController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPlanController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPriceManagementController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/controller/ReturnManagementController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/controller/ReturnSaleProductController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionBomStructureController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionOperationTaskController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionOrderController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionOrderPickController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingOperationParamController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/common/CommonController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/tool/swagger/TestController.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/controller/InfoController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/controller/PlanController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/projectManagement/controller/RolesController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/controller/PurchaseReturnOrdersController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsDetailsVo.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsVo.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/controller/QualityInspectFileController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/controller/SafeAccidentController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/controller/SafeCertificationController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/controller/SafeCertificationFileController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/controller/SafeContingencyPlanController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/controller/SafeHazardController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/controller/SafeHazardRecordController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/controller/SafeHiddenController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/controller/SafeHiddenFileController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/controller/SafeTrainingController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/controller/SafeTrainingDetailsController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/safe/controller/SafeTrainingFileController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/PaymentShippingController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/SalespersonManagementController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/MetricStatisticsServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/vo/CustomerTransactionsDetailsVo.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/vo/CustomerTransactionsVo.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/controller/HolidayApplicationController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/controller/PersonalAttendanceLocationConfigController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/controller/PersonalShiftController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/controller/StaffLeaveController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/controller/StaffSchedulingController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/pojo/StockInRecord.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/controller/TechnologyBomStructureController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/controller/TechnologyRoutingController.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationController.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationParamController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/controller/DocumentationFileController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-zqsy.yml 255 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/approve/ApproveProcessMapper.xml 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/basic/CustomerMapper.xml 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/basic/SupplierManageMapper.xml 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/device/DeviceMaintenanceMapper.xml 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionOperationTaskMapper.xml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionOrderMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionPlanMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/quality/QualityInspectMapper.xml 213 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/SalesLedgerProductMapper.xml 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/stock/StockInRecordMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/stock/StockOutRecordMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/system/SysUserMapper.xml 582 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/com/ruoyi/stock/service/impl/StockOutRecordBatchUpdateTest.java 254 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
@@ -6,6 +6,7 @@
!gradle/wrapper/gradle-wrapper.jar
claude.md
target/
test/
!.mvn/wrapper/maven-wrapper.jar
######################################################################
doc/20260523_ÐÂÔöÈë¿â¼Ç¼±íµÄÔ¤¾¯ÊýÁ¿.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,2 @@
alter table stock_in_record
    add warn_num decimal(16, 4) null comment '预警数量';
doc/update_after_sales_service.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,2 @@
ALTER TABLE `after_sales_service`
    ADD COLUMN `product_model_quantities` varchar(255) DEFAULT NULL COMMENT '产品型号对应售后数量';
src/main/java/com/ruoyi/aftersalesservice/pojo/AfterSalesService.java
@@ -157,6 +157,9 @@
    @Schema(description = "产品型号IDs")
    private String productModelIds;
    @Schema(description = "产品型号数量,逗号分隔")
    private String productModelQuantities;
    @Schema(description = "评分(1-5分)")
    @Excel(name = "评分")
    private BigDecimal rating;
src/main/java/com/ruoyi/aftersalesservice/service/impl/AfterSalesServiceServiceImpl.java
@@ -44,6 +44,7 @@
    private final SysUserMapper sysUserMapper;
    private final ISalesLedgerProductService salesLedgerProductService;
    private final ISalesLedgerService salesLedgerService;
    private final com.ruoyi.sales.mapper.ShippingInfoMapper shippingInfoMapper;
    @Override
    public IPage<AfterSalesServiceNewDto> listPage(Page page, AfterSalesServiceNewDto afterSalesService) {
@@ -81,6 +82,38 @@
        SalesLedger byId = salesLedgerService.getById(afterSalesService.getSalesLedgerId());
        List<Long> collect = Arrays.stream(afterSalesService.getProductModelIds().split(",")).map(Long::valueOf).collect(Collectors.toList());
        List<SalesLedgerProduct> list = salesLedgerProductService.list(new QueryWrapper<SalesLedgerProduct>().lambda().in(SalesLedgerProduct::getId, collect));
        if (StringUtils.isNotEmpty(afterSalesService.getProductModelQuantities())) {
            String[] quantities = afterSalesService.getProductModelQuantities().split(",");
            for (int i = 0; i < collect.size(); i++) {
                Long productId = collect.get(i);
                for (SalesLedgerProduct product : list) {
                    if (product.getId().equals(productId)) {
                        if (i < quantities.length && StringUtils.isNotEmpty(quantities[i])) {
                            product.setQuantity(new java.math.BigDecimal(quantities[i]));
                        }
                        break;
                    }
                }
            }
        }
        for (SalesLedgerProduct product : list) {
            com.ruoyi.sales.pojo.ShippingInfo shippingInfo = shippingInfoMapper.selectOne(
                new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<com.ruoyi.sales.pojo.ShippingInfo>()
                    .eq(com.ruoyi.sales.pojo.ShippingInfo::getSalesLedgerProductId, product.getId())
                    .orderByDesc(com.ruoyi.sales.pojo.ShippingInfo::getCreateTime)
                    .last("limit 1")
            );
            if (shippingInfo != null) {
                product.setShippingCarNumber(shippingInfo.getShippingCarNumber());
                product.setShippingDate(shippingInfo.getShippingDate());
                product.setShippingStatus(shippingInfo.getStatus());
                product.setExpressCompany(shippingInfo.getExpressCompany());
                product.setExpressNumber(shippingInfo.getExpressNumber());
            }
        }
        AfterSalesServiceNewDto afterSalesServiceNewDto = new AfterSalesServiceNewDto();
        BeanUtils.copyProperties(afterSalesService, afterSalesServiceNewDto);
        SalesLedgerDto salesLedgerDto = new SalesLedgerDto();
src/main/java/com/ruoyi/ai/controller/FinancialAiController.java
@@ -8,6 +8,8 @@
import com.ruoyi.ai.store.MongoChatMemoryStore;
import com.ruoyi.common.utils.SecurityUtils;
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.security.LoginUser;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
@@ -56,6 +58,7 @@
    }
    @Operation(summary = "财务智能体对话")
    @Log(title = "财务智能体对话", businessType = BusinessType.OTHER)
    @PostMapping(value = "/chat", produces = "text/stream;charset=utf-8")
    public Flux<String> chat(@RequestBody ChatForm chatForm) {
        if (!StringUtils.hasText(chatForm.getMemoryId())) {
@@ -100,6 +103,7 @@
    }
    @Operation(summary = "删除财务智能体会话")
    @Log(title = "删除财务智能体会话", businessType = BusinessType.DELETE)
    @DeleteMapping("/history/{memoryId}")
    public AjaxResult deleteSession(@PathVariable String memoryId) {
        aiSessionUserContext.remove(memoryId);
src/main/java/com/ruoyi/ai/controller/ManufacturingAiController.java
@@ -8,6 +8,8 @@
import com.ruoyi.ai.store.MongoChatMemoryStore;
import com.ruoyi.common.utils.SecurityUtils;
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.security.LoginUser;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
@@ -56,6 +58,7 @@
    }
    @Operation(summary = "制造对话")
    @Log(title = "制造智能体对话", businessType = BusinessType.OTHER)
    @PostMapping(value = "/chat", produces = "text/stream;charset=utf-8")
    public Flux<String> chat(@RequestBody ChatForm chatForm) {
        if (!StringUtils.hasText(chatForm.getMemoryId())) {
@@ -100,6 +103,7 @@
    }
    @Operation(summary = "删除制造会话")
    @Log(title = "删除制造智能体会话", businessType = BusinessType.DELETE)
    @DeleteMapping("/history/{memoryId}")
    public AjaxResult deleteSession(@PathVariable String memoryId) {
        aiSessionUserContext.remove(memoryId);
src/main/java/com/ruoyi/ai/controller/PurchaseAiController.java
@@ -4,6 +4,8 @@
import com.ruoyi.ai.bean.PurchaseAiConfirmRequest;
import com.ruoyi.ai.service.PurchaseAiService;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
@@ -32,6 +34,7 @@
    }
    @Operation(summary = "采购对话")
    @Log(title = "采购智能体对话", businessType = BusinessType.OTHER)
    @PostMapping(value = "/chat", produces = "text/stream;charset=utf-8")
    public Flux<String> chat(@RequestBody ChatForm chatForm) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
@@ -39,6 +42,7 @@
    }
    @Operation(summary = "采购多文件分析")
    @Log(title = "采购多文件分析", businessType = BusinessType.OTHER)
    @PostMapping(value = "/analyze-files", consumes = "multipart/form-data", produces = "text/stream;charset=utf-8")
    public Flux<String> analyzeFiles(@RequestParam("files") MultipartFile[] files,
                                     @RequestParam(value = "message", required = false) String message,
@@ -48,6 +52,7 @@
    }
    @Operation(summary = "采购多文件分析确认处理")
    @Log(title = "采购多文件分析确认", businessType = BusinessType.OTHER)
    @PostMapping("/analyze-files/confirm")
    public AjaxResult confirmAnalyzeResult(@RequestBody PurchaseAiConfirmRequest request) {
        return purchaseAiService.confirmAnalyzeResult(request);
@@ -68,6 +73,7 @@
    }
    @Operation(summary = "删除采购会话")
    @Log(title = "删除采购智能体会话", businessType = BusinessType.DELETE)
    @DeleteMapping("/history/{memoryId}")
    public AjaxResult deleteSession(@PathVariable String memoryId) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
src/main/java/com/ruoyi/ai/controller/SalesAiController.java
@@ -8,6 +8,8 @@
import com.ruoyi.ai.store.MongoChatMemoryStore;
import com.ruoyi.common.utils.SecurityUtils;
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.security.LoginUser;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
@@ -56,6 +58,7 @@
    }
    @Operation(summary = "销售助手对话")
    @Log(title = "销售智能体对话", businessType = BusinessType.OTHER)
    @PostMapping(value = "/chat", produces = "text/stream;charset=utf-8")
    public Flux<String> chat(@RequestBody ChatForm chatForm) {
        if (!StringUtils.hasText(chatForm.getMemoryId())) {
@@ -110,6 +113,7 @@
    }
    @Operation(summary = "删除销售助手会话")
    @Log(title = "删除销售智能体会话", businessType = BusinessType.DELETE)
    @DeleteMapping("/history/{memoryId}")
    public AjaxResult deleteSession(@PathVariable String memoryId) {
        aiSessionUserContext.remove(memoryId);
src/main/java/com/ruoyi/ai/controller/XiaozhiController.java
@@ -10,6 +10,8 @@
import com.ruoyi.ai.store.MongoChatMemoryStore;
import com.ruoyi.common.utils.SecurityUtils;
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.security.LoginUser;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
@@ -70,6 +72,7 @@
    }
    @Operation(summary = "对话")
    @Log(title = "协同办公助手对话", businessType = BusinessType.OTHER)
    @PostMapping(value = "/chat", produces = "text/stream;charset=utf-8")
    public Flux<String> chat(@RequestBody ChatForm chatForm) {
        if (!StringUtils.hasText(chatForm.getMemoryId())) {
@@ -111,6 +114,7 @@
    }
    @Operation(summary = "上传文件分析")
    @Log(title = "上传文件分析", businessType = BusinessType.OTHER)
    @PostMapping(value = "/analyze-file", consumes = "multipart/form-data", produces = "text/stream;charset=utf-8")
    public Flux<String> analyzeFile(@RequestParam("file") MultipartFile file,
                                    @RequestParam(value = "message", required = false) String message,
@@ -169,6 +173,7 @@
    }
    @Operation(summary = "删除会话")
    @Log(title = "删除协同办公助手会话", businessType = BusinessType.DELETE)
    @DeleteMapping("/history/{memoryId}")
    public AjaxResult deleteSession(@PathVariable String memoryId) {
        aiSessionUserContext.remove(memoryId);
src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java
@@ -2,6 +2,8 @@
import com.ruoyi.approve.pojo.ApproveNode;
import com.ruoyi.approve.service.IApproveNodeService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
@@ -35,6 +37,7 @@
     * @param approveNode
     * @return
     */
    @Log(title = "审批节点", businessType = BusinessType.UPDATE)
    @PostMapping("/updateApproveNode")
    @Transactional(rollbackFor = Exception.class)
    @Operation(summary = "审批节点")
@@ -48,6 +51,7 @@
     * @param id
     * @return
     */
    @Log(title = "初始化审批节点", businessType = BusinessType.INSERT)
    @PostMapping("/init")
    public AjaxResult init(String id) {
        approveNodeService.initApproveNodes("",id,1L);
src/main/java/com/ruoyi/approve/controller/ApproveProcessConfigNodeController.java
@@ -2,6 +2,8 @@
import com.ruoyi.approve.pojo.ApproveProcessConfigNode;
import com.ruoyi.approve.service.ApproveProcessConfigNodeService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
@@ -41,6 +43,7 @@
     * @return
     */
    @ApiOperation("添加审批节点")
    @Log(title = "审批流程节点", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public R addApproveProcessConfigNodes(@RequestBody List<ApproveProcessConfigNode> approveProcessConfigNodes) {
        return R.ok(approveProcessConfigNodeService.addApproveProcessConfigNodes(approveProcessConfigNodes));
src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java
@@ -8,6 +8,8 @@
import com.ruoyi.approve.bean.vo.ApproveProcessVO;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.project.system.domain.SysDept;
@@ -47,6 +49,7 @@
     * @param approveProcessVO
     * @return
     */
    @Log(title = "添加审批", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @Transactional(rollbackFor = Exception.class)
    @Operation(summary = "添加审批")
@@ -78,6 +81,7 @@
     * @param approveGetAndUpdateVo
     * @return
     */
    @Log(title = "更新审批", businessType = BusinessType.UPDATE)
    @PostMapping("/update")
    @Transactional(rollbackFor = Exception.class)
    @Operation(summary = "更新审批")
@@ -103,6 +107,7 @@
     * @param ids
     * @return
     */
    @Log(title = "删除审批", businessType = BusinessType.DELETE)
    @DeleteMapping("/deleteIds")
    @Operation(summary = "删除审批")
    @Transactional(rollbackFor = Exception.class)
@@ -115,6 +120,7 @@
    }
    @Operation(summary = "公出管理导出")
    @Log(title = "公出管理导出", businessType = BusinessType.EXPORT)
    @PostMapping("/exportOne")
    public void exportOne(HttpServletResponse response) {
        List<ApproveProcess> accountExpenses = approveProcessService.list(new LambdaQueryWrapper<ApproveProcess>()
@@ -125,6 +131,7 @@
    }
    @Operation(summary = "请假管理导出")
    @Log(title = "请假管理导出", businessType = BusinessType.EXPORT)
    @PostMapping("/exportTwo")
    public void exportTwo(HttpServletResponse response) {
        List<ApproveProcess> accountExpenses = approveProcessService.list(new LambdaQueryWrapper<ApproveProcess>()
@@ -135,6 +142,7 @@
    }
    @Operation(summary = "出差管理导出")
    @Log(title = "出差管理导出", businessType = BusinessType.EXPORT)
    @PostMapping("/exportThree")
    public void exportThree(HttpServletResponse response) {
        List<ApproveProcess> accountExpenses = approveProcessService.list(new LambdaQueryWrapper<ApproveProcess>()
@@ -145,6 +153,7 @@
    }
    @Operation(summary = "报销管理导出")
    @Log(title = "报销管理导出", businessType = BusinessType.EXPORT)
    @PostMapping("/exportFour")
    public void exportFour(HttpServletResponse response) {
        List<ApproveProcess> accountExpenses = approveProcessService.list(new LambdaQueryWrapper<ApproveProcess>()
@@ -155,6 +164,7 @@
    }
    @Operation(summary = "采购申请导出")
    @Log(title = "采购申请导出", businessType = BusinessType.EXPORT)
    @PostMapping("/exportFive")
    public void exportFive(HttpServletResponse response) {
        List<ApproveProcess> accountExpenses = approveProcessService.list(new LambdaQueryWrapper<ApproveProcess>()
@@ -165,6 +175,7 @@
    }
    @Operation(summary = "协同审批导出")
    @Log(title = "协同审批导出", businessType = BusinessType.EXPORT)
    @PostMapping("/exportZero")
    public void exportZero(HttpServletResponse response) {
        List<ApproveProcess> accountExpenses = approveProcessService.list(new LambdaQueryWrapper<ApproveProcess>()
@@ -175,6 +186,7 @@
    }
    @Operation(summary = "危险作业审批导出")
    @Log(title = "危险作业审批导出", businessType = BusinessType.EXPORT)
    @PostMapping("/exportEight")
    public void exportEight(HttpServletResponse response) {
        List<ApproveProcess> accountExpenses = approveProcessService.list(new LambdaQueryWrapper<ApproveProcess>()
src/main/java/com/ruoyi/approve/controller/HolidaySettingsController.java
@@ -7,6 +7,8 @@
import com.ruoyi.approve.mapper.WorkingHoursSettingMapper;
import com.ruoyi.approve.pojo.*;
import com.ruoyi.approve.service.HolidaySettingsService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
@@ -37,6 +39,7 @@
     * å¢žæ·»
     * @return
     */
    @Log(title = "增添假期设置", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public AjaxResult add(@RequestBody HolidaySettings holidaySettings){
        return AjaxResult.success(holidaySettingsService.save(holidaySettings));
@@ -45,6 +48,7 @@
     * æ›´æ–°
     * @return
     */
    @Log(title = "更新假期设置", businessType = BusinessType.UPDATE)
    @PostMapping("/update")
    public AjaxResult update(@RequestBody HolidaySettings holidaySettings){
        return AjaxResult.success(holidaySettingsService.updateById(holidaySettings));
@@ -53,6 +57,7 @@
     * åˆ é™¤
     * @return
     */
    @Log(title = "删除假期设置", businessType = BusinessType.DELETE)
    @DeleteMapping("/delete")
    public AjaxResult delete(@RequestBody List<Long> ids){
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
@@ -72,6 +77,7 @@
     * å¢žæ·»å¹´å‡è§„则
     * @return
     */
    @Log(title = "增添年假规则", businessType = BusinessType.INSERT)
    @PostMapping("/addAnnualLeaveSetting")
    public AjaxResult addAnnualLeaveSetting(@RequestBody AnnualLeaveSetting annualLeaveSetting){
        return AjaxResult.success(annualLeaveSettingMapper.insert(annualLeaveSetting));
@@ -80,6 +86,7 @@
     * æ›´æ–°å¹´å‡è§„则
     * @return
     */
    @Log(title = "更新年假规则", businessType = BusinessType.UPDATE)
    @PostMapping("/updateAnnualLeaveSetting")
    public AjaxResult updateAnnualLeaveSetting(@RequestBody AnnualLeaveSetting annualLeaveSetting){
        return AjaxResult.success(annualLeaveSettingMapper.updateById(annualLeaveSetting));
@@ -88,6 +95,7 @@
     * åˆ é™¤å¹´å‡è§„则
     * @return
     */
    @Log(title = "删除年假规则", businessType = BusinessType.DELETE)
    @DeleteMapping("/deleteAnnualLeaveSetting")
    public AjaxResult deleteAnnualLeaveSetting(@RequestBody List<Long> ids){
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
@@ -108,6 +116,7 @@
     * å¢žæ·»åŠ ç­è§„åˆ™
     * @return
     */
    @Log(title = "增添加班规则", businessType = BusinessType.INSERT)
    @PostMapping("/addOvertimeSetting")
    public AjaxResult addOvertimeSetting(@RequestBody OvertimeSetting overtimeSetting){
        return AjaxResult.success(overtimeSettingMapper.insert(overtimeSetting));
@@ -116,6 +125,7 @@
     * æ›´æ–°åŠ ç­è§„åˆ™
     * @return
     */
    @Log(title = "更新加班规则", businessType = BusinessType.UPDATE)
    @PostMapping("/updateOvertimeSetting")
    public AjaxResult updateOvertimeSetting(@RequestBody OvertimeSetting overtimeSetting){
        return AjaxResult.success(overtimeSettingMapper.updateById(overtimeSetting));
@@ -124,6 +134,7 @@
     * åˆ é™¤åŠ ç­è§„åˆ™
     * @return
     */
    @Log(title = "删除加班规则", businessType = BusinessType.DELETE)
    @DeleteMapping("/deleteOvertimeSetting")
    public AjaxResult deleteOvertimeSetting(@RequestBody List<Long> ids){
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
@@ -143,6 +154,7 @@
     * å¢žæ·»ç­åˆ¶è§„则
     * @return
     */
    @Log(title = "增添班制规则", businessType = BusinessType.INSERT)
    @PostMapping("/addWorkingHoursSetting")
    public AjaxResult addWorkingHoursSetting(@RequestBody WorkingHoursSetting workingHoursSetting){
        return AjaxResult.success(workingHoursSettingMapper.insert(workingHoursSetting));
@@ -151,6 +163,7 @@
     * æ›´æ–°ç­åˆ¶è§„则
     * @return
     */
    @Log(title = "更新班制规则", businessType = BusinessType.UPDATE)
    @PostMapping("/updateWorkingHoursSetting")
    public AjaxResult updateWorkingHoursSetting(@RequestBody WorkingHoursSetting workingHoursSetting){
        return AjaxResult.success(workingHoursSettingMapper.updateById(workingHoursSetting));
@@ -159,6 +172,7 @@
     * åˆ é™¤ç­åˆ¶è§„则
     * @return
     */
    @Log(title = "删除班制规则", businessType = BusinessType.DELETE)
    @DeleteMapping("/deleteWorkingHoursSetting")
    public AjaxResult deleteWorkingHoursSetting(@RequestBody List<Long> ids){
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
src/main/java/com/ruoyi/approve/controller/KnowledgeBaseController.java
@@ -5,6 +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.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
@@ -35,6 +37,7 @@
     * å¢žæ·»
     * @return
     */
    @Log(title = "知识库", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public AjaxResult add(@RequestBody KnowledgeBase knowledgeBase){
        return AjaxResult.success(knowledgeBaseService.save(knowledgeBase));
@@ -43,6 +46,7 @@
     * æ›´æ–°
     * @return
     */
    @Log(title = "知识库", businessType = BusinessType.UPDATE)
    @PostMapping("/update")
    public AjaxResult update(@RequestBody KnowledgeBase knowledgeBase){
        return AjaxResult.success(knowledgeBaseService.updateById(knowledgeBase));
@@ -51,12 +55,14 @@
     * åˆ é™¤
     * @return
     */
    @Log(title = "知识库", businessType = BusinessType.DELETE)
    @DeleteMapping("/delete")
    public AjaxResult delete(@RequestBody List<Long> ids){
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
        return AjaxResult.success(knowledgeBaseService.removeByIds(ids));
    }
    @Log(title = "知识库", businessType = BusinessType.EXPORT)
    @Operation(summary = "知识库管理导出")
    @PostMapping("/export")
    public void export(HttpServletResponse response) {
src/main/java/com/ruoyi/approve/controller/NotificationManagementController.java
@@ -8,6 +8,8 @@
import com.ruoyi.approve.pojo.NotificationManagement;
import com.ruoyi.approve.pojo.OnlineMeeting;
import com.ruoyi.approve.service.NotificationManagementService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
@@ -36,6 +38,7 @@
     * å¢žæ·»
     * @return
     */
    @Log(title = "增添通知管理", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public AjaxResult add(@RequestBody NotificationManagement notificationManagement){
        return AjaxResult.success(notificationManagementService.save(notificationManagement));
@@ -44,6 +47,7 @@
     * æ›´æ–°
     * @return
     */
    @Log(title = "更新通知管理", businessType = BusinessType.UPDATE)
    @PostMapping("/update")
    public AjaxResult update(@RequestBody NotificationManagement notificationManagement){
        return AjaxResult.success(notificationManagementService.updateById(notificationManagement));
@@ -52,6 +56,7 @@
     * åˆ é™¤
     * @return
     */
    @Log(title = "删除通知管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/delete")
    public AjaxResult delete(@RequestBody List<Long> ids){
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
@@ -62,6 +67,7 @@
     * @param onlineMeeting
     * @return
     */
    @Log(title = "新增线上会议", businessType = BusinessType.INSERT)
    @PostMapping("/addOnlineMeeting")
    public AjaxResult addOnlineMeeting(@RequestBody OnlineMeeting onlineMeeting){
        return AjaxResult.success(onlineMeetingMapper.insert(onlineMeeting));
@@ -70,6 +76,7 @@
     *新增文件共享
     *
     */
    @Log(title = "新增文件共享", businessType = BusinessType.INSERT)
    @PostMapping("/addFileSharing")
    public AjaxResult addFileSharing(@RequestBody FileSharing fileSharing){
        return AjaxResult.success(fileSharingMapper.insert(fileSharing));
src/main/java/com/ruoyi/approve/controller/RpaProcessAutomationController.java
@@ -5,6 +5,8 @@
import com.ruoyi.approve.pojo.RpaProcessAutomation;
import com.ruoyi.approve.service.RpaProcessAutomationService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
@@ -34,6 +36,7 @@
     * å¢žæ·»
     * @return
     */
    @Log(title = "RPA流程自动化", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public AjaxResult add(@RequestBody RpaProcessAutomation rpaProcessAutomation){
        return AjaxResult.success(rpaProcessAutomationService.save(rpaProcessAutomation));
@@ -42,6 +45,7 @@
     * æ›´æ–°
     * @return
     */
    @Log(title = "RPA流程自动化", businessType = BusinessType.UPDATE)
    @PostMapping("/update")
    public AjaxResult update(@RequestBody RpaProcessAutomation rpaProcessAutomation){
        return AjaxResult.success(rpaProcessAutomationService.updateById(rpaProcessAutomation));
@@ -50,12 +54,14 @@
     * åˆ é™¤
     * @return
     */
    @Log(title = "RPA流程自动化", businessType = BusinessType.DELETE)
    @DeleteMapping("/delete")
    public AjaxResult delete(@RequestBody List<Long> ids){
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
        return AjaxResult.success(rpaProcessAutomationService.removeByIds(ids));
    }
    @Log(title = "RPA流程自动化", businessType = BusinessType.EXPORT)
    @Operation(summary = "RPA流程自动化导出")
    @PostMapping("/export")
    public void export(HttpServletResponse response) {
src/main/java/com/ruoyi/basic/controller/StorageAttachmentController.java
@@ -2,6 +2,8 @@
import com.ruoyi.basic.dto.StorageAttachmentDTO;
import com.ruoyi.basic.service.StorageAttachmentService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -35,6 +37,7 @@
     * @param ids æ–‡ä»¶id列表
     * @return åˆ é™¤ç»“æžœ
     */
    @Log(title = "存储附件", businessType = BusinessType.DELETE)
    @DeleteMapping("/delete")
    @Operation(summary = "删除通用文件上传的附件信息")
    public R batchDelete(@RequestBody List<Long> ids) {
@@ -44,6 +47,7 @@
    /**
     * ä¿å­˜é€šç”¨æ–‡ä»¶ä¸Šä¼ çš„附件信息
     */
    @Log(title = "存储附件", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @Operation(summary = "保存通用文件上传的附件信息")
    public R add(@RequestBody StorageAttachmentDTO storageAttachmentDTO) {
src/main/java/com/ruoyi/basic/controller/SupplierManageController.java
@@ -28,6 +28,7 @@
     * @param supplierManage
     * @return
     */
    @Log(title = "供应商管理", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public AjaxResult add(@RequestBody SupplierManage supplierManage) {
        supplierService.saveSupplier(supplierManage);
@@ -39,6 +40,7 @@
     * @param ids
     * @return
     */
    @Log(title = "供应商管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/del")
    public AjaxResult delSupplier(@RequestBody List<Integer> ids) {
        if(CollectionUtils.isEmpty(ids)){
@@ -63,6 +65,7 @@
     * @param supplierManage
     * @return
     */
    @Log(title = "供应商管理", businessType = BusinessType.UPDATE)
    @PostMapping("/update")
    public AjaxResult update(@RequestBody SupplierManage supplierManage) {
        supplierService.supplierUpdate(supplierManage);
@@ -85,6 +88,7 @@
     * @param response
     * @param supplierManageDto
     */
    @Log(title = "供应商管理", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void supplierExport(HttpServletResponse response,SupplierManageDto supplierManageDto) {
        supplierService.supplierExport(response, supplierManageDto);
src/main/java/com/ruoyi/basic/controller/SupplierManageFileController.java
@@ -3,6 +3,8 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.pojo.SupplierManageFile;
import com.ruoyi.basic.service.SupplierManageFileService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
@@ -27,6 +29,7 @@
     * @param supplierManageFile
     * @return
     */
    @Log(title = "新增供应商附件", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public AjaxResult add(@RequestBody SupplierManageFile supplierManageFile) {
        return AjaxResult.success(supplierManageFileService.save(supplierManageFile));
@@ -37,6 +40,7 @@
     * @param ids
     * @return
     */
    @Log(title = "删除供应商附件", businessType = BusinessType.DELETE)
    @DeleteMapping("/del")
    public AjaxResult delSupplierManageFile(@RequestBody List<Integer> ids) {
        if(CollectionUtils.isEmpty(ids)){
src/main/java/com/ruoyi/collaborativeApproval/controller/DutyPlanController.java
@@ -7,6 +7,8 @@
import com.ruoyi.collaborativeApproval.pojo.RulesRegulationsManagement;
import com.ruoyi.collaborativeApproval.service.DutyPlanService;
import com.ruoyi.common.utils.excel.ExcelUtils;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.v3.oas.annotations.Operation;
import lombok.AllArgsConstructor;
@@ -34,18 +36,21 @@
        return AjaxResult.success(dutyPlanService.getNum());
    }
    @Log(title = "新增值班计划", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @Operation(summary = "新增")
    public AjaxResult add(@RequestBody DutyPlan dutyPlan){
        return AjaxResult.success(dutyPlanService.save(dutyPlan));
    }
    @Log(title = "修改值班计划", businessType = BusinessType.UPDATE)
    @PostMapping("/update")
    @Operation(summary = "修改")
    public AjaxResult update(@RequestBody DutyPlan dutyPlan){
        return AjaxResult.success(dutyPlanService.updateById(dutyPlan));
    }
    @Log(title = "删除值班计划", businessType = BusinessType.DELETE)
    @DeleteMapping("/delete")
    @Operation(summary = "删除")
    public AjaxResult delete(@RequestBody List<Long> ids){
@@ -54,6 +59,7 @@
        }
        return AjaxResult.success(dutyPlanService.removeBatchByIds(ids));
    }
    @Log(title = "导出值班计划", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    @Operation(summary = "导出")
    public void exportData(HttpServletResponse response, DutyPlanDTO dutyPlanDTO){
src/main/java/com/ruoyi/collaborativeApproval/controller/MeetingController.java
@@ -13,6 +13,8 @@
import com.ruoyi.collaborativeApproval.vo.SearchMeetingRoomVo;
import com.ruoyi.collaborativeApproval.vo.SearchMeetingUseVo;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
@@ -42,6 +44,7 @@
        return R.ok(meetingService.getMeetingRoomList(vo));
    }
    @Log(title = "新增会议室", businessType = BusinessType.INSERT)
    @PostMapping("/saveRoom")
    public R saveRoom(@RequestBody MeetingRoom meetingRoom) {
        meetingService.saveMeetRoom(meetingRoom);
@@ -53,6 +56,7 @@
        return R.ok(meetingService.findMeetRoomById(id));
    }
    @Log(title = "删除会议室", businessType = BusinessType.DELETE)
    @DeleteMapping("/delRoom/{id}")
    public R deleteRoom(@PathVariable Long id) {
        meetingService.deleteMeetingRoom(id);
@@ -69,18 +73,21 @@
        return R.ok(meetingService.getMeetingDraftList(vo));
    }
    @Log(title = "保存会议草稿", businessType = BusinessType.INSERT)
    @PostMapping("/saveDraft")
    public R saveMeetingDraft(@RequestBody MeetDraft meetDraft) {
        meetingService.saveMeetDraft(meetDraft);
        return R.ok();
    }
    @Log(title = "删除会议草稿", businessType = BusinessType.DELETE)
    @DeleteMapping("/delDraft/{id}")
    public R deleteMeetingDraft(@PathVariable Long id) {
        meetingService.deleteMeetingDraft(id);
        return R.ok();
    }
    @Log(title = "新增会议申请", businessType = BusinessType.INSERT)
    @PostMapping("/saveMeetingApplication")
    public R saveMeetApplication(@RequestBody MeetApplication meetApplication) {
       return meetingService.saveMeetApplication(meetApplication);
@@ -110,6 +117,7 @@
        return R.ok(meetingService.getMeetingMinutesById(id));
    }
    @Log(title = "保存会议纪要", businessType = BusinessType.INSERT)
    @PostMapping("/saveMeetingMinutes")
    public R saveMeetingMinutes(@RequestBody MeetingMinutes meetingMinutes) {
        meetingService.saveMeetingMinutes(meetingMinutes);
@@ -127,6 +135,7 @@
    }
    @Operation(summary = "会议室设置导出")
    @Log(title = "导出会议室设置", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response) {
        List<MeetingRoom> accountExpenses = meetingService.list();
@@ -137,6 +146,7 @@
    private final MeetDraftMapper meetDraftMapper;
    @Operation(summary = "会议草稿导出")
    @Log(title = "导出会议草稿", businessType = BusinessType.EXPORT)
    @PostMapping("/exportOne")
    public void exportOne(HttpServletResponse response) {
        List<MeetDraft> accountExpenses = meetDraftMapper.selectList(new LambdaQueryWrapper<MeetDraft>());
src/main/java/com/ruoyi/collaborativeApproval/controller/NoticeTypeController.java
@@ -5,6 +5,8 @@
import com.ruoyi.basic.pojo.SupplierManage;
import com.ruoyi.collaborativeApproval.pojo.NoticeType;
import com.ruoyi.collaborativeApproval.service.NoticeTypeService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
@@ -33,6 +35,7 @@
     * @param noticeType
     * @return
     */
    @Log(title = "新增公告类型", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public AjaxResult add(@RequestBody NoticeType noticeType) {
        return AjaxResult.success(noticeTypeService.saveOrUpdate(noticeType));
@@ -43,6 +46,7 @@
     * @param ids
     * @return
     */
    @Log(title = "删除公告类型", businessType = BusinessType.DELETE)
    @DeleteMapping("/del")
    public AjaxResult delNoticeType(@RequestBody List<Integer> ids) {
        if(CollectionUtils.isEmpty(ids)){
src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementController.java
@@ -8,6 +8,8 @@
import com.ruoyi.collaborativeApproval.pojo.SealApplicationManagement;
import com.ruoyi.collaborativeApproval.service.RulesRegulationsManagementService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
@@ -33,6 +35,7 @@
        return AjaxResult.success(rulesRegulationsManagementService.listPage(page, rulesRegulationsManagement));
    }
    @Log(title = "新增规章制度", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @Operation(summary = "新增")
    public AjaxResult add(@RequestBody RulesRegulationsManagement rulesRegulationsManagement){
@@ -40,12 +43,14 @@
        return AjaxResult.success(rulesRegulationsManagement.getId());
    }
    @Log(title = "修改规章制度", businessType = BusinessType.UPDATE)
    @PostMapping("/update")
    @Operation(summary = "修改")
    public AjaxResult update(@RequestBody RulesRegulationsManagement rulesRegulationsManagement){
        return AjaxResult.success(rulesRegulationsManagementService.updateById(rulesRegulationsManagement));
    }
    @Log(title = "删除规章制度", businessType = BusinessType.DELETE)
    @DeleteMapping("/delete")
    @Operation(summary = "删除")
    public AjaxResult delete(@PathVariable("ids") List<Long> ids){
@@ -55,11 +60,13 @@
        return AjaxResult.success(rulesRegulationsManagementService.removeBatchByIds(ids));
    }
    //规则查看时新增阅读状态
    @Log(title = "新增阅读状态", businessType = BusinessType.INSERT)
    @PostMapping("/addReadingStatus")
    @Operation(summary = "新增阅读状态")
    public AjaxResult addReadingStatus(@RequestBody ReadingStatus readingStatus){
        return AjaxResult.success(readingStatusMapper.insert(readingStatus));
    }
    @Log(title = "修改阅读状态", businessType = BusinessType.UPDATE)
    @PostMapping("/updateReadingStatus")
    @Operation(summary = "修改阅读状态")
    public AjaxResult updateReadingStatus(@RequestBody ReadingStatus readingStatus){
@@ -77,6 +84,7 @@
    }
    @Operation(summary = "规章制度管理导出")
    @Log(title = "导出规章制度", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response) {
        List<RulesRegulationsManagement> accountExpenses = rulesRegulationsManagementService.list();
src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementFileController.java
@@ -3,6 +3,8 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.collaborativeApproval.pojo.RulesRegulationsManagementFile;
import com.ruoyi.collaborativeApproval.service.RulesRegulationsManagementFileService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.quality.pojo.QualityInspectFile;
import com.ruoyi.quality.service.IQualityInspectFileService;
@@ -33,6 +35,7 @@
     * @param rulesRegulationsManagementFile
     * @return
     */
    @Log(title = "规章制度文件", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public AjaxResult add(@RequestBody RulesRegulationsManagementFile rulesRegulationsManagementFile) {
        return AjaxResult.success(rulesRegulationsManagementFileService.save(rulesRegulationsManagementFile));
@@ -43,6 +46,7 @@
     * @param ids
     * @return
     */
    @Log(title = "规章制度文件", businessType = BusinessType.DELETE)
    @DeleteMapping("/del")
    public AjaxResult delQualityUnqualified(@RequestBody List<Integer> ids) {
        if(CollectionUtils.isEmpty(ids)){
src/main/java/com/ruoyi/collaborativeApproval/controller/SealApplicationManagementController.java
@@ -10,6 +10,7 @@
import com.ruoyi.collaborativeApproval.service.SealApplicationManagementService;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.project.system.service.ISysNoticeService;
@@ -39,6 +40,7 @@
        return AjaxResult.success(sealApplicationManagementService.listPage(page,sealApplicationManagement));
    }
    @Log(title = "用章申请", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @Operation(summary = "新增")
    public AjaxResult add(@RequestBody SealApplicationManagementDTO sealApplicationManagement){
@@ -57,6 +59,7 @@
        return AjaxResult.success();
    }
    @Log(title = "用章申请", businessType = BusinessType.UPDATE)
    @PostMapping("/update")
    @Operation(summary = "修改")
    public AjaxResult update(@RequestBody SealApplicationManagementDTO sealApplicationManagement){
@@ -68,6 +71,7 @@
        return AjaxResult.success(sealApplicationManagementService.updateById(sealApplicationManagement));
    }
    @Log(title = "用章申请", businessType = BusinessType.DELETE)
    @DeleteMapping("/delete")
    @Operation(summary = "删除")
    public AjaxResult delete(@PathVariable("ids") List<Long> ids){
@@ -80,6 +84,7 @@
        return AjaxResult.success(sealApplicationManagementService.removeBatchByIds(ids));
    }
    @Log(title = "用章申请", businessType = BusinessType.EXPORT)
    @Operation(summary = "用印申请管理导出")
    @PostMapping("/export")
    public void export(HttpServletResponse response) {
src/main/java/com/ruoyi/collaborativeApproval/controller/StaffContactsPersonalController.java
@@ -4,6 +4,8 @@
import com.ruoyi.collaborativeApproval.dto.StaffContactsPersonalDTO;
import com.ruoyi.collaborativeApproval.pojo.StaffContactsPersonal;
import com.ruoyi.collaborativeApproval.service.StaffContactsPersonalService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.v3.oas.annotations.Operation;
import lombok.AllArgsConstructor;
@@ -21,12 +23,14 @@
        return AjaxResult.success(staffContactsPersonalService.listPage(page, staffContactsPersonalDTO));
    }
    @Log(title = "新增员工通讯录", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @Operation(summary = "新增")
    public AjaxResult add(@RequestBody StaffContactsPersonal staffContactsPersonal) {
        return AjaxResult.success(staffContactsPersonalService.save(staffContactsPersonal));
    }
    @Log(title = "删除员工通讯录", businessType = BusinessType.DELETE)
    @DeleteMapping("/delete/{id}")
    @Operation(summary = "删除")
    public AjaxResult delete(@PathVariable("id") Long id) {
src/main/java/com/ruoyi/device/controller/DeviceDefectRecordController.java
@@ -4,6 +4,8 @@
import com.ruoyi.device.dto.DeviceDefectRecordDto;
import com.ruoyi.device.pojo.DeviceDefectRecord;
import com.ruoyi.device.service.DeviceDefectRecordService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
@@ -29,16 +31,19 @@
        return AjaxResult.success(deviceDefectRecordService.listPage(new Page<>(1,-1),deviceDefectRecordDto));
    }
    @Log(title = "新增设备缺陷记录", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @Operation(summary = "添加设备缺陷记录")
    public AjaxResult add(@RequestBody DeviceDefectRecord deviceDefectRecord) {
        return AjaxResult.success(deviceDefectRecordService.add(deviceDefectRecord));
    }
    @Log(title = "修改设备缺陷记录", businessType = BusinessType.UPDATE)
    @PostMapping("/update")
    @Operation(summary = "修改设备缺陷记录")
    public AjaxResult update(@RequestBody DeviceDefectRecord deviceDefectRecord) {
        return AjaxResult.success(deviceDefectRecordService.updateByDDR(deviceDefectRecord));
    }
    @Log(title = "删除设备缺陷记录", businessType = BusinessType.DELETE)
    @DeleteMapping("/delete")
    @Operation(summary = "删除设备缺陷记录")
    public AjaxResult delete(@PathVariable Long id) {
src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java
@@ -12,6 +12,8 @@
import com.ruoyi.device.pojo.DeviceMaintenance;
import com.ruoyi.device.service.IDeviceLedgerService;
import com.ruoyi.framework.aspectj.lang.annotation.Anonymous;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
@@ -41,6 +43,7 @@
        return AjaxResult.success(deviceLedgerService.queryPage(page, deviceLedger));
    }
    @Log(title = "新增设备台账", businessType = BusinessType.INSERT)
    @PostMapping()
    @Operation(summary = "添加设备台账")
    public AjaxResult add(@RequestBody DeviceLedgerDto deviceLedgerDto) {
@@ -54,12 +57,14 @@
        return AjaxResult.success(deviceLedgerDto);
    }
    @Log(title = "修改设备台账", businessType = BusinessType.UPDATE)
    @PutMapping()
    @Operation(summary = "修改设备台账")
    public AjaxResult update(@RequestBody DeviceLedgerDto deviceLedgerDto) {
        return deviceLedgerService.updateDeviceLedger(deviceLedgerDto);
    }
    @Log(title = "删除设备台账", businessType = BusinessType.DELETE)
    @DeleteMapping("/{ids}")
    @Operation(summary = "删除设备台账")
    public AjaxResult delete(@PathVariable("ids") ArrayList<Long> ids) {
@@ -70,12 +75,14 @@
        return AjaxResult.success();
    }
    @Log(title = "导出设备台账", businessType = BusinessType.EXPORT)
    @PostMapping("export")
    @Operation(summary = "导出设备台账")
    public void export(HttpServletResponse response, Long[] ids) {
        deviceLedgerService.export(response, ids);
    }
    @Log(title = "下载设备台账模板", businessType = BusinessType.EXPORT)
    @Operation(summary = "下载模板")
    @PostMapping("/downloadTemplate")
    public void downloadTemplate(HttpServletResponse response) {
@@ -83,6 +90,7 @@
        util.importTemplateExcel(response, "设备导入模板");
    }
    @Log(title = "导入设备台账", businessType = BusinessType.IMPORT)
    @PostMapping("/import")
    @Operation(summary = "导入设备台账")
    public AjaxResult importData(MultipartFile file) throws IOException {
src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java
@@ -7,6 +7,8 @@
import com.ruoyi.device.pojo.DeviceMaintenance;
import com.ruoyi.device.service.IDeviceLedgerService;
import com.ruoyi.device.service.IDeviceMaintenanceService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
@@ -32,6 +34,7 @@
        return AjaxResult.success(deviceMaintenanceService.queryPage(page,deviceMaintenanceDto));
    }
    @Log(title = "新增设备保养", businessType = BusinessType.INSERT)
    @PostMapping()
    @Operation(summary = "添加设备保养")
    public AjaxResult add(@RequestBody DeviceMaintenanceDto deviceMaintenance) {
@@ -47,6 +50,7 @@
        return AjaxResult.success(deviceMaintenanceService.detailById(id));
    }
    @Log(title = "修改设备保养", businessType = BusinessType.UPDATE)
    @PutMapping ()
    @Operation(summary = "修改设备保养")
    public AjaxResult update(@RequestBody DeviceMaintenanceDto deviceMaintenance) {
@@ -56,6 +60,7 @@
        return deviceMaintenanceService.updateDeviceDeviceMaintenance(deviceMaintenance);
    }
    @Log(title = "执行设备保养", businessType = BusinessType.UPDATE)
    @PostMapping ("maintenance")
    @Operation(summary = "修改设备保养")
    public AjaxResult maintenance(@RequestBody DeviceMaintenanceDto deviceMaintenance) {
@@ -63,6 +68,7 @@
    }
    @Log(title = "删除设备保养", businessType = BusinessType.DELETE)
    @DeleteMapping("/{ids}")
    @Operation(summary = "删除设备保养")
    public AjaxResult delete(@PathVariable("ids") Long[] ids) {
@@ -73,6 +79,7 @@
        return AjaxResult.success();
    }
    @Log(title = "导出设备保养", businessType = BusinessType.EXPORT)
    @PostMapping("export")
    @Operation(summary = "导出设备保养")
    public void export(HttpServletResponse response, Long[] ids) {
src/main/java/com/ruoyi/device/controller/DeviceMaintenanceFileController.java
@@ -4,6 +4,8 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.device.pojo.DeviceMaintenanceFile;
import com.ruoyi.device.service.DeviceMaintenanceFileService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.util.CollectionUtils;
@@ -34,6 +36,7 @@
     * @param deviceMaintenanceFile
     * @return
     */
    @Log(title = "新增设备保养附件", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public AjaxResult add(@RequestBody DeviceMaintenanceFile deviceMaintenanceFile) {
        return AjaxResult.success(deviceMaintenanceFileService.save(deviceMaintenanceFile));
@@ -44,6 +47,7 @@
     * @param ids
     * @return
     */
    @Log(title = "删除设备保养附件", businessType = BusinessType.DELETE)
    @DeleteMapping("/del")
    public AjaxResult delQualityUnqualified(@RequestBody List<Integer> ids) {
        if(CollectionUtils.isEmpty(ids)){
src/main/java/com/ruoyi/device/controller/DeviceRepairController.java
@@ -5,6 +5,8 @@
import com.ruoyi.device.dto.DeviceRepairDto;
import com.ruoyi.device.pojo.DeviceRepair;
import com.ruoyi.device.service.IDeviceRepairService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
@@ -28,6 +30,7 @@
        return AjaxResult.success(deviceRepairService.queryPage(page,deviceRepairDto));
    }
    @Log(title = "新增设备报修", businessType = BusinessType.INSERT)
    @PostMapping()
    @Operation(summary = "添加设备报修")
    public AjaxResult add( @RequestBody DeviceRepairDto deviceRepairDto) {
@@ -40,24 +43,28 @@
        return AjaxResult.success(deviceRepairService.detailById(id));
    }
    @Log(title = "修改设备报修", businessType = BusinessType.UPDATE)
    @PutMapping ()
    @Operation(summary = "修改设备报修")
    public AjaxResult update( @RequestBody DeviceRepairDto deviceRepairDto) {
        return deviceRepairService.updateDeviceRepair(deviceRepairDto);
    }
    @Log(title = "设备维修", businessType = BusinessType.UPDATE)
    @PostMapping ("/repair")
    @Operation(summary = "设备维修")
    public AjaxResult repair( @RequestBody DeviceRepairDto deviceRepairDto) {
        return deviceRepairService.confirmRepair(deviceRepairDto);
    }
    @Log(title = "设备报修验收", businessType = BusinessType.UPDATE)
    @PostMapping ("/acceptance")
    @Operation(summary = "设备报修验收审批")
    public AjaxResult acceptance(@RequestBody DeviceRepairDto deviceRepairDto) {
        return deviceRepairService.approveRepairAcceptance(deviceRepairDto);
    }
    @Log(title = "删除设备报修", businessType = BusinessType.DELETE)
    @DeleteMapping("/{ids}")
    @Operation(summary = "删除设备报修")
    public AjaxResult delete(@PathVariable("ids") Long[] ids) {
@@ -68,6 +75,7 @@
        return AjaxResult.success();
    }
    @Log(title = "导出设备报修", businessType = BusinessType.EXPORT)
    @PostMapping("export")
    @Operation(summary = "导出设备报修")
    public void export(HttpServletResponse response, Long[] ids) {
src/main/java/com/ruoyi/inspectiontask/controller/InspectionTaskController.java
@@ -3,6 +3,8 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.inspectiontask.dto.InspectionTaskDto;
@@ -43,8 +45,9 @@
    /**
     * å¯¼å‡º
     */
    @PostMapping("/export")
    @Log(title = "检验任务", businessType = BusinessType.EXPORT)
    @Operation(summary = "导出定时任务记录")
    @PostMapping("/export")
    public void export(HttpServletResponse response) {
        Page page = new Page<>(-1, -1);
        InspectionTaskDto timingTask = new InspectionTaskDto();
@@ -56,8 +59,9 @@
    /**
     * å·¡æ£€ä»»åŠ¡è¡¨æ–°å¢žä¿®æ”¹
     */
    @PostMapping("/addOrEditInspectionTask")
    @Log(title = "检验任务", businessType = BusinessType.INSERT)
    @Operation(summary = "巡检任务表新增修改")
    @PostMapping("/addOrEditInspectionTask")
    @Transactional(rollbackFor = Exception.class)
    public R addOrEditInspectionTask(@RequestBody InspectionTaskDto inspectionTaskDto) {
        return R.ok(inspectionTaskService.addOrEditInspectionTask(inspectionTaskDto));
@@ -66,8 +70,9 @@
    /**
     * å·¡æ£€ä»»åŠ¡è¡¨åˆ é™¤
     */
    @DeleteMapping("/delInspectionTask")
    @Log(title = "检验任务", businessType = BusinessType.DELETE)
    @Operation(summary = "巡检任务表删除")
    @DeleteMapping("/delInspectionTask")
    @Transactional(rollbackFor = Exception.class)
    public R remove(@RequestBody Long[] ids) {
        return R.ok(inspectionTaskService.delByIds(ids));
src/main/java/com/ruoyi/inspectiontask/controller/QrCodeController.java
@@ -2,6 +2,8 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.inspectiontask.dto.QrCodeDto;
@@ -37,8 +39,9 @@
    /**
     * äºŒç»´ç ç®¡ç†è¡¨æ–°å¢žä¿®æ”¹
     */
    @PostMapping("/addOrEditQrCode")
    @Log(title = "二维码", businessType = BusinessType.INSERT)
    @Operation(summary = "二维码管理表新增修改")
    @PostMapping("/addOrEditQrCode")
    public R<Long> addOrEditQrCode(@RequestBody QrCodeDto qrCodeDto) {
        return R.ok(qrCodeService.addOrEditQrCode(qrCodeDto));
    }
@@ -46,8 +49,9 @@
    /**
     * äºŒç»´ç ç®¡ç†è¡¨åˆ é™¤
     */
    @DeleteMapping("/delQrCode")
    @Log(title = "二维码", businessType = BusinessType.DELETE)
    @Operation(summary = "二维码管理表删除")
    @DeleteMapping("/delQrCode")
    public R remove(@RequestBody Long[] ids) {
        return R.ok(qrCodeService.delByIds(ids));
    }
src/main/java/com/ruoyi/inspectiontask/controller/QrCodeScanRecordController.java
@@ -2,6 +2,8 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.inspectiontask.dto.QrCodeScanRecordDto;
@@ -38,8 +40,9 @@
    /**
     * äºŒç»´ç æ‰«ç è®°å½•表新增修改
     */
    @PostMapping("/addOrEditQrCodeRecord")
    @Log(title = "二维码扫描记录", businessType = BusinessType.INSERT)
    @Operation(summary = "二维码扫码记录表新增修改")
    @PostMapping("/addOrEditQrCodeRecord")
    public R addOrEditQrCodeRecord(@RequestBody QrCodeScanRecordDto qrCodeScanRecordDto) {
        return R.ok(qrCodeScanRecordService.addOrEditQrCodeRecord(qrCodeScanRecordDto));
    }
@@ -47,8 +50,9 @@
    /**
     * äºŒç»´ç æ‰«ç è®°å½•表删除
     */
    @DeleteMapping("/delSalesRecord")
    @Log(title = "二维码扫描记录", businessType = BusinessType.DELETE)
    @Operation(summary = "二维码扫码记录表删除")
    @DeleteMapping("/delSalesRecord")
    public R remove(@RequestBody Long[] ids) {
        return R.ok(qrCodeScanRecordService.delByIds(ids));
    }
src/main/java/com/ruoyi/inspectiontask/controller/TimingTaskController.java
@@ -42,6 +42,7 @@
    /**
     * å¯¼å‡º
     */
    @Log(title = "定时任务", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    @Operation(summary = "导出定时任务")
    public void export(HttpServletResponse response) {
@@ -55,9 +56,9 @@
    /**
     * å®šæ—¶å·¡æ£€ä»»åŠ¡è¡¨æ–°å¢žä¿®æ”¹
     */
    @Log(title = "定时任务", businessType = BusinessType.INSERT)
    @PostMapping("/addOrEditTimingTask")
    @Operation(summary = "新增修改定时任务")
    @Log(title = "定时任务", businessType = BusinessType.INSERT)
    public R addOrEditTimingTask(@RequestBody TimingTaskDto timingTaskDto) throws SchedulerException {
        return R.ok(timingTaskService.addOrEditTimingTask(timingTaskDto));
    }
@@ -65,9 +66,9 @@
    /**
     * å®šæ—¶å·¡æ£€ä»»åŠ¡è¡¨åˆ é™¤
     */
    @Log(title = "定时任务", businessType = BusinessType.DELETE)
    @DeleteMapping("/delTimingTask")
    @Operation(summary = "删除定时任务")
    @Log(title = "定时任务", businessType = BusinessType.DELETE)
    public R remove(@RequestBody Long[] ids) {
        return R.ok(timingTaskService.delByIds(ids));
    }
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java
@@ -35,6 +35,17 @@
        // èŽ·å–çŽ°æœ‰è§¦å‘å™¨å¹¶è½¬æ¢ä¸º CronTrigger
        Trigger oldTrigger = scheduler.getTrigger(triggerKey);
        if (oldTrigger == null) {
            JobKey jobKey = new JobKey("timingTask_" + task.getId());
            JobDetail jobDetail = scheduler.getJobDetail(jobKey);
            if (jobDetail != null) {
                Trigger trigger = buildJobTrigger(task, jobDetail);
                scheduler.scheduleJob(trigger);
            } else {
                scheduleTimingTask(task);
            }
            return;
        }
        if (!(oldTrigger instanceof CronTrigger)) {
            throw new SchedulerException("Existing trigger is not a CronTrigger");
        }
@@ -144,18 +155,13 @@
        // ä½¿ç”¨switch确保条件互斥
        String frequencyType = task.getFrequencyType().toUpperCase(); // ç»Ÿä¸€è½¬ä¸ºå¤§å†™æ¯”较
        switch (frequencyType) {
            case "DAILY":
                return convertDailyToCron(task.getFrequencyDetail());
            case "WEEKLY":
                return convertWeeklyToCron(task.getFrequencyDetail());
            case "MONTHLY":
                return convertMonthlyToCron(task.getFrequencyDetail());
            case "QUARTERLY":
                return convertQuarterlyToCron(task.getFrequencyDetail());
            default:
                throw new IllegalArgumentException("不支持的频率类型: " + task.getFrequencyType());
        }
        return switch (frequencyType) {
            case "DAILY" -> convertDailyToCron(task.getFrequencyDetail());
            case "WEEKLY" -> convertWeeklyToCron(task.getFrequencyDetail());
            case "MONTHLY" -> convertMonthlyToCron(task.getFrequencyDetail());
            case "QUARTERLY" -> convertQuarterlyToCron(task.getFrequencyDetail());
            default -> throw new IllegalArgumentException("不支持的频率类型: " + task.getFrequencyType());
        };
    }
    // æ¯æ—¥ä»»åŠ¡è½¬æ¢
src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsRequisitionRecordController.java
@@ -2,6 +2,8 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.measuringinstrumentledger.dto.SparePartsRequisitionRecordDto;
import com.ruoyi.measuringinstrumentledger.service.SparePartsRequisitionRecordService;
@@ -29,6 +31,7 @@
    @GetMapping("/listPage")
    @Operation(summary = "备件分类-分页查询")
    @Log(title = "备件领用记录-分页查询", businessType = BusinessType.OTHER)
    public AjaxResult listPage(Page page, SparePartsRequisitionRecordDto sparePartsRequisitionRecordDto){
        IPage<SparePartsRequisitionRecordDto> listPage = sparePartsRequisitionRecordService.listPage(page, sparePartsRequisitionRecordDto);
        return AjaxResult.success(listPage);
src/main/java/com/ruoyi/officesupplies/controller/OfficeSuppliesController.java
@@ -44,6 +44,7 @@
    @PostMapping("/add")
    @Operation(summary = "办公物资-添加")
    @Log(title = "办公物资-添加", businessType = BusinessType.INSERT)
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult add(@RequestBody OfficeSupplies officeSupplies) {
        // æŒ‰ç…§å½“前时间yyyyMMdd + å½“天新增数量 + 1生成编号
@@ -60,6 +61,7 @@
    @PostMapping("/update")
    @Operation(summary = "办公物资-修改")
    @Log(title = "办公物资-修改", businessType = BusinessType.UPDATE)
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult update(@RequestBody OfficeSupplies officeSupplies) {
        return officeSuppliesService.updateById(officeSupplies) ? success() : error();
@@ -67,6 +69,7 @@
    @DeleteMapping("/delete")
    @Operation(summary = "办公物资-删除")
    @Log(title = "办公物资-删除", businessType = BusinessType.DELETE)
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult delete(@RequestBody List<Long> ids) {
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
src/main/java/com/ruoyi/other/controller/PdaVersionController.java
@@ -1,6 +1,8 @@
package com.ruoyi.other.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.other.dto.PdaVersionDTO;
import com.ruoyi.other.pojo.PdaVersion;
@@ -23,6 +25,7 @@
    }
    @Operation(summary = "添加版本")
    @Log(title = "PDA版本-添加", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public R add(@RequestBody PdaVersionDTO pdaVersion) {
        return R.ok(pdaVersionService.add(pdaVersion));
src/main/java/com/ruoyi/procurementrecord/controller/GasTankWarningController.java
@@ -3,6 +3,8 @@
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.procurementrecord.pojo.GasTankWarning;
import com.ruoyi.procurementrecord.service.GasTankWarningService;
@@ -23,23 +25,26 @@
        return AjaxResult.success(gasTankWarningService.listPage(page, gasTankWarning));
    }
    @Log(title = "新增气瓶预警", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public AjaxResult add(@RequestBody GasTankWarning gasTankWarning) {
        return AjaxResult.success(gasTankWarningService.save(gasTankWarning));
    }
    @Log(title = "修改气瓶预警", businessType = BusinessType.UPDATE)
    @PostMapping("update")
    public AjaxResult update(@RequestBody GasTankWarning gasTankWarning) {
        return AjaxResult.success(gasTankWarningService.updateById(gasTankWarning));
    }
    @Log(title = "删除气瓶预警", businessType = BusinessType.DELETE)
    @DeleteMapping("delete")
    public AjaxResult delete(@RequestBody List<Long> ids) {
        if (CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
        return AjaxResult.success(gasTankWarningService.removeByIds(ids));
    }
    //导出
    @Log(title = "导出气瓶预警", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, @RequestParam(name = "ids", required = false) List<Long> ids) {
        gasTankWarningService.export(response, ids);
src/main/java/com/ruoyi/procurementrecord/controller/InboundManagementController.java
@@ -3,6 +3,8 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.procurementrecord.pojo.InboundManagement;
@@ -35,6 +37,7 @@
        return AjaxResult.success(result);
    }
    @Log(title = "新增到货管理", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @Operation(summary = "到货管理-添加")
    @Transactional(rollbackFor = Exception.class)
@@ -44,6 +47,7 @@
        return result ? AjaxResult.success() : AjaxResult.error();
    }
    @Log(title = "修改到货管理", businessType = BusinessType.UPDATE)
    @PostMapping("/update")
    @Operation(summary = "到货管理-修改")
    @Transactional(rollbackFor = Exception.class)
@@ -52,6 +56,7 @@
        return result ? AjaxResult.success() : AjaxResult.error();
    }
    @Log(title = "删除到货管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/del")
    @Operation(summary = "到货管理-删除")
    @Transactional(rollbackFor = Exception.class)
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementExceptionRecordController.java
@@ -1,5 +1,7 @@
package com.ruoyi.procurementrecord.controller;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.procurementrecord.mapper.ProcurementExceptionRecordMapper;
@@ -21,12 +23,14 @@
    private ProcurementExceptionRecordMapper procurementExceptionRecordMapper;
    @Log(title = "新增采购异常记录", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @Transactional
    public AjaxResult add(@RequestBody ProcurementExceptionRecord procurementExceptionRecord) {
        return AjaxResult.success(procurementExceptionRecordMapper.insert(procurementExceptionRecord));
    }
    @Log(title = "修改采购异常记录", businessType = BusinessType.UPDATE)
    @PostMapping("/update")
    @Transactional
    public AjaxResult updatePro(@RequestBody ProcurementExceptionRecord procurementExceptionRecord) {
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPlanController.java
@@ -2,6 +2,8 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.procurementrecord.pojo.ProcurementPlan;
@@ -33,6 +35,7 @@
        return AjaxResult.success(result);
    }
    @Log(title = "新增采购计划", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @Operation(summary = "采购计划-添加")
    public AjaxResult add(@RequestBody ProcurementPlan procurementPlan){
@@ -40,6 +43,7 @@
        return result ? AjaxResult.success() : AjaxResult.error();
    }
    @Log(title = "修改采购计划", businessType = BusinessType.UPDATE)
    @PostMapping("/update")
    @Operation(summary = "采购计划-修改")
    public AjaxResult update(@RequestBody ProcurementPlan procurementPlan){
@@ -47,6 +51,7 @@
        return result ? AjaxResult.success() : AjaxResult.error();
    }
    @Log(title = "删除采购计划", businessType = BusinessType.DELETE)
    @DeleteMapping("/del")
    @Operation(summary = "采购计划-删除")
    public AjaxResult del(@RequestBody List<Long> ids){
@@ -54,10 +59,7 @@
        return result ? AjaxResult.success() : AjaxResult.error();
    }
    /**
     * å¯¼å‡º
     * @param response
     */
    @Log(title = "导出采购计划", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response) {
        procurementPlanService.export(response);
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPriceManagementController.java
@@ -2,6 +2,8 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.procurementrecord.pojo.ProcurementPriceManagement;
@@ -34,6 +36,7 @@
        return AjaxResult.success(result);
    }
    @Log(title = "新增采购价格管理", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @Operation(summary = "采购价格管理-添加")
    @Transactional(rollbackFor = Exception.class)
@@ -42,6 +45,7 @@
        return result ? AjaxResult.success() : AjaxResult.error();
    }
    @Log(title = "修改采购价格管理", businessType = BusinessType.UPDATE)
    @PostMapping("/update")
    @Operation(summary = "采购价格管理-修改")
    @Transactional(rollbackFor = Exception.class)
@@ -50,6 +54,7 @@
        return result ? AjaxResult.success() : AjaxResult.error();
    }
    @Log(title = "删除采购价格管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/del")
    @Operation(summary = "采购价格管理-删除")
    @Transactional(rollbackFor = Exception.class)
@@ -61,10 +66,7 @@
        return result ? AjaxResult.success() : AjaxResult.error();
    }
    /**
     * å¯¼å‡º
     * @param response
     */
    @Log(title = "导出采购价格管理", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response) {
        procurementPriceManagementService.export(response);
src/main/java/com/ruoyi/procurementrecord/controller/ReturnManagementController.java
@@ -8,6 +8,8 @@
import com.ruoyi.account.pojo.AccountStatementDetails;
import com.ruoyi.account.service.AccountStatementDetailsService;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.procurementrecord.bean.dto.ReturnManagementDto;
@@ -45,6 +47,7 @@
        return AjaxResult.success(result);
    }
    @Log(title = "新增销售退货", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @Operation(summary = "销售退货-添加")
    @Transactional(rollbackFor = Exception.class)
@@ -52,6 +55,7 @@
        return returnManagementService.addReturnManagementDto(returnManagementDto) ? success() : error();
    }
    @Log(title = "修改销售退货", businessType = BusinessType.UPDATE)
    @PostMapping("/update")
    @Operation(summary = "销售退货-修改")
    @Transactional(rollbackFor = Exception.class)
@@ -68,6 +72,7 @@
    }
    @Log(title = "删除销售退货", businessType = BusinessType.DELETE)
    @DeleteMapping("/del")
    @Operation(summary = "销售退货-删除")
    @Transactional(rollbackFor = Exception.class)
src/main/java/com/ruoyi/procurementrecord/controller/ReturnSaleProductController.java
@@ -1,5 +1,7 @@
package com.ruoyi.procurementrecord.controller;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
src/main/java/com/ruoyi/production/controller/ProductionBomStructureController.java
@@ -1,5 +1,7 @@
package com.ruoyi.production.controller;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.bean.dto.ProductionBomStructureDto;
import com.ruoyi.production.bean.vo.ProductionBomStructureVo;
@@ -31,6 +33,7 @@
        return R.ok(productionBomStructureService.listByBomId(bomId));
    }
    @Log(title = "新增或修改BOM结构", businessType = BusinessType.UPDATE)
    @PostMapping("/addOrUpdateBomStructs")
    @Operation(summary = "新增或修改BOM结构")
    public R addProductionBomStructure(@RequestBody ProductionBomStructureDto productionBomStructureDto) {
src/main/java/com/ruoyi/production/controller/ProductionOperationTaskController.java
@@ -1,5 +1,7 @@
package com.ruoyi.production.controller;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.bean.dto.ProductionOperationTaskDto;
@@ -40,36 +42,42 @@
        return R.ok(productionOperationTaskService.getProductionOperationTaskInfo(id));
    }
    @Log(title = "新增工单", businessType = BusinessType.INSERT)
    @PostMapping
    @Operation(summary = "新增工单")
    public R<Boolean> add(@RequestBody ProductionOperationTask productionOperationTask) {
        return R.ok(productionOperationTaskService.saveProductionOperationTask(productionOperationTask));
    }
    @Log(title = "修改工单", businessType = BusinessType.UPDATE)
    @PutMapping
    @Operation(summary = "修改工单")
    public R<Boolean> edit(@RequestBody ProductionOperationTask productionOperationTask) {
        return R.ok(productionOperationTaskService.saveProductionOperationTask(productionOperationTask));
    }
    @Log(title = "删除工单", businessType = BusinessType.DELETE)
    @DeleteMapping("/delete")
    @Operation(summary = "删除工单")
    public R<Boolean> remove(@RequestBody List<Long> ids) {
        return R.ok(productionOperationTaskService.removeProductionOperationTask(ids));
    }
    @Log(title = "产品工单更新", businessType = BusinessType.UPDATE)
    @Operation(summary = "产品工单更新")
    @PostMapping("/updateProductWorkOrder")
    public R updateProductWorkOrder(@RequestBody ProductionOperationTaskDto dto) {
        return R.ok(productionOperationTaskService.updateProductWorkOrder(dto));
    }
    @Log(title = "指派报工人", businessType = BusinessType.UPDATE)
    @Operation(summary = "指派报工人")
    @PostMapping("/assign")
    public R<Boolean> assign(@RequestBody ProductionOperationTaskDto dto) {
        return R.ok(productionOperationTaskService.assign(dto));
    }
    @Log(title = "工单流转卡下载", businessType = BusinessType.EXPORT)
    @PostMapping("/down")
    @Operation(summary = "工单流转卡下载")
    public void down(HttpServletResponse response, @RequestBody ProductionOperationTaskDto dto) {
src/main/java/com/ruoyi/production/controller/ProductionOrderController.java
@@ -53,6 +53,7 @@
        return R.ok(productionOrderService.getProductionOrderInfo(id));
    }
    @Log(title = "生产工单", businessType = BusinessType.INSERT)
    @PostMapping("/addOrder")
    @Operation(summary = "新增生产订单", description = "新增下单只支持1种方式:生产计划生成,传 productionPlanIds,系统自动汇总计划得到产品规格和数量;"
                    + "technologyRoutingId ä¸ºç©ºæ—¶ä¼šè‡ªåŠ¨åŒ¹é…è¯¥äº§å“è§„æ ¼æœ€æ–°å·¥è‰ºè·¯çº¿ï¼Œquantity æœ€ç»ˆå¿…须大于 0。")
@@ -62,18 +63,21 @@
        return R.ok(productionOrderService.saveProductionOrder(productionOrder));
    }
    @Log(title = "生产工单", businessType = BusinessType.UPDATE)
    @Operation(summary = "绑定工艺路线")
    @PostMapping("/bindingRoute")
    public R bindingRoute(@RequestBody ProductionOrderDto productionOrderDto) {
        return R.ok(productionOrderService.bindingRoute(productionOrderDto));
    }
    @Log(title = "生产工单", businessType = BusinessType.UPDATE)
    @PostMapping("/syncSnapshot/{id}")
    @Operation(summary = "同步生产订单工艺/BOM快照")
    public R<Integer> syncSnapshot(@PathVariable Long id) {
        return R.ok(productionOrderService.syncProductionOrderSnapshot(id));
    }
    @Log(title = "生产工单", businessType = BusinessType.DELETE)
    @DeleteMapping("/delete")
    @Operation(summary = "删除生产订单")
    public R<Boolean> remove(@RequestBody List<Long> ids) {
@@ -98,6 +102,7 @@
        return R.ok(productionOrderService.getWorkOrderReportInspectDetail(productionOrderDto));
    }
    @Log(title = "生产工单", businessType = BusinessType.UPDATE)
    @Operation(summary = "更新订单状态")
    @PostMapping("/updateOrder")
    public R updateOrder(@RequestBody ProductionOrderDto productionOrderDto) {
src/main/java/com/ruoyi/production/controller/ProductionOrderPickController.java
@@ -1,5 +1,7 @@
package com.ruoyi.production.controller;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.bean.dto.ProductionOrderPickDto;
import com.ruoyi.production.bean.vo.ProductionOrderPickVo;
@@ -27,12 +29,14 @@
    private final ProductionOrderPickService productionOrderPickService;
    @Log(title = "领料保存到线边仓", businessType = BusinessType.INSERT)
    @PostMapping("/savePick")
    @Operation(summary = "领料保存到线边仓")
    public R<Boolean> savePick(@RequestBody ProductionOrderPickDto dto) {
        return R.ok(productionOrderPickService.savePick(dto));
    }
    @Log(title = "变更领料", businessType = BusinessType.UPDATE)
    @PostMapping("/updatePick")
    @Operation(summary = "变更领料")
    public R<Boolean> updatePick(@RequestBody ProductionOrderPickDto dto) {
src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingController.java
@@ -1,5 +1,7 @@
package com.ruoyi.production.controller;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.pojo.ProductionOrderRoutingOperation;
import com.ruoyi.production.service.ProductionOrderRoutingOperationService;
@@ -30,24 +32,28 @@
        return R.ok(productionOrderRoutingService.listMain(orderId));
    }
    @Log(title = "生产工序路由", businessType = BusinessType.INSERT)
    @PostMapping("/addRouteItem")
    @Operation(summary = "新增生产订单的工艺路线详情")
    public R addRouteItem(@RequestBody ProductionOrderRoutingOperation productionOrderRoutingOperation) {
        return productionOrderRoutingOperationService.addRouteItem(productionOrderRoutingOperation);
    }
    @Log(title = "生产工序路由", businessType = BusinessType.UPDATE)
    @PostMapping("/updateRouteItem")
    @Operation(summary = "修改生产订单的工艺路线详情")
    public R updateRouteItem(@RequestBody ProductionOrderRoutingOperation productionOrderRoutingOperation) {
        return R.ok(productionOrderRoutingOperationService.updateRouteItem(productionOrderRoutingOperation));
    }
    @Log(title = "生产工序路由", businessType = BusinessType.DELETE)
    @DeleteMapping("/deleteRouteItem/{id}")
    @Operation(summary = "删除生产工艺路线")
    public R deleteRouteItem(@PathVariable("id") Long id) {
        return productionOrderRoutingOperationService.deleteRouteItem(id);
    }
    @Log(title = "生产工序路由", businessType = BusinessType.UPDATE)
    @PostMapping("/sortRouteItem")
    @Operation(summary = "排序")
    public R sortRouteItem(@RequestBody ProductionOrderRoutingOperation productionOrderRoutingOperation) {
src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingOperationParamController.java
@@ -2,6 +2,8 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.bean.dto.ProductionOrderRoutingOperationParamDto;
import com.ruoyi.production.bean.vo.ProductionOrderRoutingOperationParamVo;
@@ -41,18 +43,21 @@
        return R.ok(productionOrderRoutingOperationParamService.getProductionOrderRoutingOperationParamInfo(id));
    }
    @Log(title = "生产工序参数", businessType = BusinessType.INSERT)
    @PostMapping
    @Operation(summary = "新增生产订单工艺路线工序参数")
    public R<Boolean> add(@RequestBody ProductionOrderRoutingOperationParam item) {
        return R.ok(productionOrderRoutingOperationParamService.saveProductionOrderRoutingOperationParam(item));
    }
    @Log(title = "生产工序参数", businessType = BusinessType.UPDATE)
    @PutMapping
    @Operation(summary = "修改生产订单工艺路线工序参数")
    public R<Boolean> edit(@RequestBody ProductionOrderRoutingOperationParam item) {
        return R.ok(productionOrderRoutingOperationParamService.updateById(item));
    }
    @Log(title = "生产工序参数", businessType = BusinessType.DELETE)
    @DeleteMapping("/{id}")
    @Operation(summary = "删除生产订单工艺路线工序参数")
    public R<Boolean> remove(@PathVariable("id") Long id) {
src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java
@@ -2,6 +2,8 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.bean.dto.ProductionProductMainDto;
import com.ruoyi.production.service.ProductionProductMainService;
@@ -50,30 +52,35 @@
     * @param productionProductMainDto
     * @return
     */
    @Log(title = "生产产品", businessType = BusinessType.INSERT)
    @PostMapping("/addProductMain")
    @PreAuthorize("@ss.hasPermi('productionProductMain:add')")
    public R addProductMain(@RequestBody ProductionProductMainDto productionProductMainDto) {
        return R.ok(productionProductMainService.addProductMain(productionProductMainDto));
    }
    @Log(title = "生产产品", businessType = BusinessType.INSERT)
    @PostMapping
    @Operation(summary = "新增生产报工")
    public R add(@RequestBody ProductionProductMainDto productionProductMainDto) {
        return R.ok(productionProductMainService.saveProductionProductMain(productionProductMainDto));
    }
    @Log(title = "生产产品", businessType = BusinessType.UPDATE)
    @PutMapping
    @Operation(summary = "修改生产报工")
    public R edit(@RequestBody ProductionProductMainDto productionProductMainDto) {
        return R.ok(productionProductMainService.saveProductionProductMain(productionProductMainDto));
    }
    @Log(title = "生产产品", businessType = BusinessType.DELETE)
    @Operation(summary = "删除报工")
    @DeleteMapping("/delete")
    public R delete(@RequestBody ProductionProductMainDto productionProductMainDto) {
        return R.ok(productionProductMainService.removeProductMain(productionProductMainDto.getId()));
    }
    @Log(title = "生产产品", businessType = BusinessType.DELETE)
    @DeleteMapping("/{id}")
    @Operation(summary = "删除生产报工")
    public R remove(@PathVariable("id") Long id) {
@@ -84,6 +91,7 @@
    /**
     * å¯¼å‡º
     */
    @Log(title = "生产产品", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, ProductionProductMainDto productionProductMainDto) {
        List<ProductionProductMainDto> list;
src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
@@ -59,6 +59,7 @@
    private final ProductionOperationTaskMapper productionOperationTaskMapper;
    private final ProductionOrderBomMapper productionOrderBomMapper;
    private final ProductionBomStructureMapper productionBomStructureMapper;
    private final ProductionOrderMapper productionOrderMapper;
    private final ProductionProductMainMapper productionProductMainMapper;
    private final ProductionProductOutputMapper productionProductOutputMapper;
    private final ProductionOrderPickMapper productionOrderPickMapper;
@@ -1029,13 +1030,46 @@
            return Collections.emptyList();
        }
        List<ProductionBomStructureVo> bomStructureList = productionBomStructureMapper.pickByBomId(orderBom.getId());
        // æŸ¥è¯¢å®Œæ•´çš„BOM结构(包括根节点),用于计算层级需求数量
        List<ProductionBomStructureVo> bomStructureList = productionBomStructureMapper.listByBomId(orderBom.getId());
        if (bomStructureList == null || bomStructureList.isEmpty()) {
            return Collections.emptyList();
        }
        // æŸ¥è¯¢ç”Ÿäº§è®¢å•获取订单数量
        ProductionOrder productionOrder = productionOrderMapper.selectById(productionOrderId);
        BigDecimal orderQuantity = productionOrder != null ? defaultDecimal(productionOrder.getQuantity()) : BigDecimal.ZERO;
        // æž„建树形结构并计算层级需求数量
        Map<Long, ProductionBomStructureVo> structureByIdMap = bomStructureList.stream()
                .filter(s -> s != null && s.getId() != null)
                .collect(Collectors.toMap(ProductionBomStructureVo::getId, s -> s));
        // æŒ‰å±‚级计算需求数量:子级需求数量 = çˆ¶çº§éœ€æ±‚数量 Ã— å­çº§å•位产出所需数量
        for (ProductionBomStructureVo structure : bomStructureList) {
            if (structure == null) continue;
            if (structure.getParentId() == null || structure.getParentId() == 0) {
                // æ ¹èŠ‚ç‚¹ï¼šéœ€æ±‚æ•°é‡ = è®¢å•数量
                structure.setDemandedQuantity(orderQuantity);
            } else {
                // å­èŠ‚ç‚¹ï¼šéœ€æ±‚æ•°é‡ = çˆ¶çº§éœ€æ±‚数量 Ã— å­çº§å•位产出所需数量
                ProductionBomStructureVo parent = structureByIdMap.get(structure.getParentId());
                if (parent != null) {
                    BigDecimal parentDemandedQty = defaultDecimal(parent.getDemandedQuantity());
                    BigDecimal unitQuantity = defaultDecimal(structure.getUnitQuantity());
                    structure.setDemandedQuantity(parentDemandedQty.multiply(unitQuantity));
                }
            }
        }
        // è¿‡æ»¤å‡ºéžæ ¹èŠ‚ç‚¹ï¼ˆå®žé™…é¢†æ–™é¡¹ï¼‰
        List<ProductionBomStructureVo> childStructureList = bomStructureList.stream()
                .filter(s -> s != null && s.getParentId() != null && s.getParentId() != 0)
                .collect(Collectors.toList());
        // éåŽ†å¤„ç†æ•°æ®å¹¶ç»„è£…ç»“æžœ
        List<Long> productModelIds = bomStructureList.stream()
        List<Long> productModelIds = childStructureList.stream()
                .map(ProductionBomStructureVo::getProductModelId)
                .filter(Objects::nonNull)
                .distinct()
@@ -1060,7 +1094,7 @@
        }
        Map<String, ProductionOrderPickVo> mergedPickMap = new LinkedHashMap<>();
        for (ProductionBomStructureVo structure : bomStructureList) {
        for (ProductionBomStructureVo structure : childStructureList) {
            if (structure == null || structure.getProductModelId() == null) {
                continue;
            }
src/main/java/com/ruoyi/project/common/CommonController.java
@@ -3,6 +3,8 @@
import com.ruoyi.basic.service.StorageBlobService;
import com.ruoyi.basic.utils.FileUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Anonymous;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -36,6 +38,7 @@
    private final StorageBlobService storageBlobService;
    private final FileUtil fileUtil;
    @Log(title = "通用文件上传", businessType = BusinessType.INSERT)
    @PostMapping({"/upload"})
    @Operation(summary = "文件上传")
    public R upload(@RequestParam("files") List<MultipartFile> files) {
@@ -46,6 +49,7 @@
     * å…¬å…±æ–‡ä»¶ä¸Šä¼ 
     * æ­¤æŽ¥å£ä¸Šä¼ çš„æ–‡ä»¶æ°¸ä¹…有效,慎用
     */
    @Log(title = "公共文件上传", businessType = BusinessType.INSERT)
    @PostMapping({"/public/upload"})
    @Operation(summary = "文件上传")
    public R publicUpload(@RequestParam("files") List<MultipartFile> files) {
src/main/java/com/ruoyi/project/tool/swagger/TestController.java
@@ -12,14 +12,16 @@
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.R;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.R;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
/**
 * swagger ç”¨æˆ·æµ‹è¯•方法
@@ -46,9 +48,9 @@
    }
    @Operation(summary = "获取用户详细")
    @Parameter(name = "userId", description = "用户ID", required = true)
    @GetMapping("/{userId}")
    public R<UserEntity> getUser(@PathVariable Integer userId)
    @Parameter(name = "userId", description = "用户ID", required = true)
    @GetMapping("/{userId}")
    public R<UserEntity> getUser(@PathVariable Integer userId)
    {
        if (!users.isEmpty() && users.containsKey(userId))
        {
@@ -60,15 +62,16 @@
        }
    }
    @Log(title = "测试接口新增用户", businessType = BusinessType.INSERT)
    @Operation(summary = "新增用户")
    @Parameters({
        @Parameter(name = "userId", description = "用户id"),
        @Parameter(name = "username", description = "用户名称"),
        @Parameter(name = "password", description = "用户密码"),
        @Parameter(name = "mobile", description = "用户手机")
    })
    @PostMapping("/save")
    public R<String> save(UserEntity user)
    @Parameters({
        @Parameter(name = "userId", description = "用户id"),
        @Parameter(name = "username", description = "用户名称"),
        @Parameter(name = "password", description = "用户密码"),
        @Parameter(name = "mobile", description = "用户手机")
    })
    @PostMapping("/save")
    public R<String> save(UserEntity user)
    {
        if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId()))
        {
@@ -78,6 +81,7 @@
        return R.ok();
    }
    @Log(title = "测试接口更新用户", businessType = BusinessType.UPDATE)
    @Operation(summary = "更新用户")
    @PutMapping("/update")
    public R<String> update(@RequestBody UserEntity user)
@@ -95,10 +99,11 @@
        return R.ok();
    }
    @Log(title = "测试接口删除用户", businessType = BusinessType.DELETE)
    @Operation(summary = "删除用户信息")
    @Parameter(name = "userId", description = "用户ID", required = true)
    @DeleteMapping("/{userId}")
    public R<String> delete(@PathVariable Integer userId)
    @Parameter(name = "userId", description = "用户ID", required = true)
    @DeleteMapping("/{userId}")
    public R<String> delete(@PathVariable Integer userId)
    {
        if (!users.isEmpty() && users.containsKey(userId))
        {
src/main/java/com/ruoyi/projectManagement/controller/InfoController.java
@@ -1,5 +1,7 @@
package com.ruoyi.projectManagement.controller;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.projectManagement.dto.InfoStageDto;
import com.ruoyi.projectManagement.dto.UpdateStateInfo;
@@ -31,6 +33,7 @@
    @PostMapping("/save")
    @Operation(summary = "保存")
    @Log(title = "项目信息-保存", businessType = BusinessType.INSERT)
    public AjaxResult save(@RequestBody @Valid SaveInfoVo saveInfoVo) {
        infoService.save(saveInfoVo);
        return AjaxResult.success();
@@ -38,6 +41,7 @@
    @PostMapping("/updateStatus")
    @Operation(summary = "修改状态")
    @Log(title = "项目信息-修改状态", businessType = BusinessType.UPDATE)
    public AjaxResult updateStatus(@RequestBody @Valid UpdateStateInfo updateStateInfo){
        infoService.updateStatus(updateStateInfo);
        return AjaxResult.success();
@@ -45,6 +49,7 @@
    @PostMapping("/delete/{id}")
    @Operation(summary = "删除")
    @Log(title = "项目信息-删除", businessType = BusinessType.DELETE)
    public AjaxResult delete(@PathVariable Long id) {
        infoService.deleteInfo(id);
        return AjaxResult.success();
@@ -65,6 +70,7 @@
    @PostMapping("/saveStage")
    @Operation(summary = "保存阶段")
    @Log(title = "项目信息-保存阶段", businessType = BusinessType.INSERT)
    public AjaxResult saveStage(@RequestBody @Valid SaveInfoStageVo dto) {
        infoStageHandleService.save(dto);
        return AjaxResult.success();
@@ -78,6 +84,7 @@
    @PostMapping("/deleteStage/{id}")
    @Operation(summary = "删除阶段")
    @Log(title = "项目信息-删除阶段", businessType = BusinessType.DELETE)
    public AjaxResult deleteStage(@PathVariable Long id) {
        infoStageHandleService.deleteById(id);
        return AjaxResult.success();
src/main/java/com/ruoyi/projectManagement/controller/PlanController.java
@@ -1,5 +1,7 @@
package com.ruoyi.projectManagement.controller;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.projectManagement.service.PlanService;
import com.ruoyi.projectManagement.vo.SavePlanNodeVo;
@@ -28,6 +30,7 @@
    @PostMapping("/save")
    @Operation(summary = "保存")
    @Log(title = "项目计划-保存", businessType = BusinessType.INSERT)
    public AjaxResult save(@RequestBody @Valid SavePlanVo savePlanVo) {
        planService.savePlan(savePlanVo);
        return AjaxResult.success();
@@ -35,6 +38,7 @@
    @PostMapping("/delete/{id}")
    @Operation(summary = "删除")
    @Log(title = "项目计划-删除", businessType = BusinessType.DELETE)
    public AjaxResult delete(@PathVariable Long id) {
        planService.deletePlan(id);
        return AjaxResult.success();
src/main/java/com/ruoyi/projectManagement/controller/RolesController.java
@@ -4,6 +4,8 @@
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.OrderUtils;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.projectManagement.dto.RoleDto;
import com.ruoyi.projectManagement.mapper.RolesMapper;
@@ -33,6 +35,7 @@
    @PostMapping("/add")
    @Operation(summary = "新增")
    @Log(title = "项目角色-新增", businessType = BusinessType.INSERT)
    public AjaxResult add(@RequestBody RoleDto roleDto) {
        if (roleDto.getIsDefaultNo()) {
            roleDto.setNo(OrderUtils.countTodayByCreateTime(rolesMapper, "XMJS","no"));
@@ -42,12 +45,14 @@
    @PostMapping("/update")
    @Operation(summary = "修改")
    @Log(title = "项目角色-修改", businessType = BusinessType.UPDATE)
    public AjaxResult update(@RequestBody Roles roles) {
        return AjaxResult.success(rolesservice.updateById(roles));
    }
    @DeleteMapping("/delete")
    @Operation(summary = "删除")
    @Log(title = "项目角色-删除", businessType = BusinessType.DELETE)
    public AjaxResult delete(@RequestBody List<Long> ids) {
        if (CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
        return AjaxResult.success(rolesservice.removeBatchByIds(ids));
src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
@@ -157,6 +157,7 @@
    /**
     * ä¿®æ”¹é‡‡è´­å°è´¦å®¡æ‰¹çŠ¶æ€
     */
    @Log(title = "采购台账", businessType = BusinessType.UPDATE)
    @PostMapping("/updateApprovalStatus")
    public AjaxResult addOrEditPurchase(@RequestBody PurchaseLedger purchaseLedger){
        return toAjax(purchaseLedgerService.updateById(purchaseLedger));
src/main/java/com/ruoyi/purchase/controller/PurchaseReturnOrdersController.java
@@ -61,6 +61,7 @@
        return AjaxResult.success(purchaseReturnOrdersService.getPurchaseReturnOrderDtoById(id));
    }
    @Log(title = "采购退货单", businessType = BusinessType.DELETE)
    @PostMapping("/deleteById/{id}")
    public AjaxResult deleteById(@PathVariable Long id) {
        //如果该采购退货已经生成对账单则无法删除
src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsDetailsVo.java
@@ -24,10 +24,10 @@
    @Schema(description = "合同金额")
    private BigDecimal contractAmount;
    @Schema(description = "付款金额")
    private BigDecimal paymentAmount;
    @Schema(description = "已入库金额")
    private BigDecimal shippedAmount;
    @Schema(description = "应付金额")
    private BigDecimal payableAmount;
    @Schema(description = "未入库金额")
    private BigDecimal unshippedAmount;
}
src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsVo.java
@@ -16,15 +16,12 @@
    private String supplierName;
    @Schema(description = "合同总金额")
    //该供应商采购合同累计金额
    private BigDecimal contractAmounts;
    @Schema(description = "付款金额")
    //该供应商采购付款累计金额
    private BigDecimal paymentAmount;
    @Schema(description = "已入库金额")
    private BigDecimal shippedAmount;
    @Schema(description = "应付金额")
    //该供应商采购应付累计金额=财务(入库-退货)
    private BigDecimal payableAmount;
    @Schema(description = "未入库金额")
    private BigDecimal unshippedAmount;
}
src/main/java/com/ruoyi/quality/controller/QualityInspectFileController.java
@@ -3,6 +3,8 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.quality.pojo.QualityInspectFile;
import com.ruoyi.quality.pojo.QualityInspectParam;
@@ -33,6 +35,7 @@
     * @param qualityInspectFile
     * @return
     */
    @Log(title = "上传质检文件", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public AjaxResult add(@RequestBody QualityInspectFile qualityInspectFile) {
        return AjaxResult.success(qualityInspectFileService.save(qualityInspectFile));
@@ -43,6 +46,7 @@
     * @param ids
     * @return
     */
    @Log(title = "删除质检文件", businessType = BusinessType.DELETE)
    @DeleteMapping("/del")
    public AjaxResult delQualityUnqualified(@RequestBody List<Integer> ids) {
        if(CollectionUtils.isEmpty(ids)){
src/main/java/com/ruoyi/safe/controller/SafeAccidentController.java
@@ -1,6 +1,8 @@
package com.ruoyi.safe.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.safe.pojo.SafeAccident;
import com.ruoyi.safe.service.SafeAccidentService;
@@ -34,18 +36,21 @@
    }
    @Operation(summary = "新增事故上报记录")
    @Log(title = "安全事故", businessType = BusinessType.INSERT)
    @PostMapping()
    public R add(@RequestBody SafeAccident safeAccident) {
        return R.ok(safeAccidentService.save(safeAccident));
    }
    @Operation(summary = "修改事故上报记录")
    @Log(title = "安全事故", businessType = BusinessType.UPDATE)
    @PutMapping ()
    public R update(@RequestBody  SafeAccident safeAccident) {
        return R.ok(safeAccidentService.updateById(safeAccident));
    }
    @Operation(summary = "删除事故上报记录")
    @Log(title = "安全事故", businessType = BusinessType.DELETE)
    @DeleteMapping("/{ids}")
    public R delSafeAccident(@RequestBody List<Integer> ids) {
        return R.ok(safeAccidentService.removeBatchByIds(ids));
src/main/java/com/ruoyi/safe/controller/SafeCertificationController.java
@@ -1,6 +1,8 @@
package com.ruoyi.safe.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.safe.pojo.SafeCertification;
import com.ruoyi.safe.service.SafeCertificationService;
@@ -35,18 +37,21 @@
    }
    @Operation(summary = "新增安全规程与资质管理")
    @Log(title = "安全证书", businessType = BusinessType.INSERT)
    @PostMapping()
    public R add(@RequestBody SafeCertification safeCertification) {
        return R.ok(safeCertificationService.save(safeCertification));
    }
    @Operation(summary = "修改安全规程与资质管理")
    @Log(title = "安全证书", businessType = BusinessType.UPDATE)
    @PutMapping ()
    public R update(@RequestBody  SafeCertification safeCertification) {
        return R.ok(safeCertificationService.updateById(safeCertification));
    }
    @Operation(summary = "删除安全规程与资质管理")
    @Log(title = "安全证书", businessType = BusinessType.DELETE)
    @DeleteMapping("/{ids}")
    public R delSafeCertification(@RequestBody List<Integer> ids) {
        return R.ok(safeCertificationService.removeBatchByIds(ids));
src/main/java/com/ruoyi/safe/controller/SafeCertificationFileController.java
@@ -2,6 +2,8 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.safe.pojo.SafeCertificationFile;
import com.ruoyi.safe.service.SafeCertificationFileService;
@@ -35,6 +37,7 @@
     * @param safeCertificationFile
     * @return
     */
    @Log(title = "新增安全证书文件", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @Operation(summary = "新增")
    public R add(@RequestBody SafeCertificationFile safeCertificationFile) {
@@ -46,6 +49,7 @@
     * @param ids
     * @return
     */
    @Log(title = "删除安全证书文件", businessType = BusinessType.DELETE)
    @DeleteMapping("/del")
    @Operation(summary = "删除")
    public R delSafeCertificationFile(@RequestBody List<Integer> ids) {
src/main/java/com/ruoyi/safe/controller/SafeContingencyPlanController.java
@@ -1,6 +1,8 @@
package com.ruoyi.safe.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.safe.pojo.SafeContingencyPlan;
import com.ruoyi.safe.service.SafeContingencyPlanService;
@@ -33,18 +35,21 @@
        return R.ok(safeContingencyPlanService.pageSafeContingencyPlan(page, safeContingencyPlan));
    }
    @Log(title = "新增应急预案", businessType = BusinessType.INSERT)
    @Operation(summary = "新增应急预案查阅")
    @PostMapping()
    public R add(@RequestBody SafeContingencyPlan safeContingencyPlan) {
        return R.ok(safeContingencyPlanService.save(safeContingencyPlan));
    }
    @Log(title = "修改应急预案", businessType = BusinessType.UPDATE)
    @Operation(summary = "修改应急预案查阅")
    @PutMapping ()
    public R update(@RequestBody  SafeContingencyPlan safeContingencyPlan) {
        return R.ok(safeContingencyPlanService.updateById(safeContingencyPlan));
    }
    @Log(title = "删除应急预案", businessType = BusinessType.DELETE)
    @Operation(summary = "删除应急预案查阅")
    @DeleteMapping("/{ids}")
    public R delSafeCertification(@RequestBody List<Integer> ids) {
src/main/java/com/ruoyi/safe/controller/SafeHazardController.java
@@ -1,6 +1,8 @@
package com.ruoyi.safe.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.safe.pojo.SafeHazard;
import com.ruoyi.safe.service.SafeHazardService;
@@ -33,18 +35,21 @@
        return R.ok(safeHazardService.pageSafeHazard(page, safeHazard));
    }
    @Log(title = "新增危险源", businessType = BusinessType.INSERT)
    @Operation(summary = "新增危险源台账")
    @PostMapping()
    public R add(@RequestBody SafeHazard safeHazard) {
        return R.ok(safeHazardService.save(safeHazard));
    }
    @Log(title = "修改危险源", businessType = BusinessType.UPDATE)
    @Operation(summary = "修改危险源台账")
    @PutMapping ()
    public R update(@RequestBody  SafeHazard safeHazard) {
        return R.ok(safeHazardService.updateById(safeHazard));
    }
    @Log(title = "删除危险源", businessType = BusinessType.DELETE)
    @Operation(summary = "删除危险源台账")
    @DeleteMapping("/{ids}")
    public R delSafeHazard(@RequestBody List<Integer> ids) {
src/main/java/com/ruoyi/safe/controller/SafeHazardRecordController.java
@@ -1,6 +1,8 @@
package com.ruoyi.safe.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.safe.dto.SafeHazardRecordDto;
import com.ruoyi.safe.pojo.SafeHazardRecord;
@@ -35,18 +37,21 @@
    }
    @Operation(summary = "领用")
    @Log(title = "危险源记录", businessType = BusinessType.INSERT)
    @PostMapping("/borrow")
    public R borrow(@RequestBody SafeHazardRecord safeHazardRecord) {
        return R.ok(safeHazardRecordService.borrow(safeHazardRecord));
    }
    @Operation(summary = "归还")
    @Log(title = "危险源记录", businessType = BusinessType.UPDATE)
    @PutMapping("/return")
    public R returnSafeHazardRecord(@RequestBody  SafeHazardRecord safeHazardRecord) {
        return R.ok(safeHazardRecordService.returnSafeHazardRecord(safeHazardRecord));
    }
    @Operation(summary = "删除")
    @Log(title = "危险源记录", businessType = BusinessType.DELETE)
    @DeleteMapping("/{ids}")
    public R delSafeHazardRecord(@RequestBody List<Integer> ids) {
        return R.ok(safeHazardRecordService.delSafeHazardRecord(ids));
src/main/java/com/ruoyi/safe/controller/SafeHiddenController.java
@@ -1,6 +1,8 @@
package com.ruoyi.safe.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.safe.dto.SafeHiddenDto;
import com.ruoyi.safe.pojo.SafeHidden;
@@ -35,18 +37,21 @@
    }
    @Operation(summary = "新增隐患排查")
    @Log(title = "安全隐患", businessType = BusinessType.INSERT)
    @PostMapping()
    public R add(@RequestBody SafeHidden safeHidden) {
        return R.ok(safeHiddenService.add(safeHidden));
    }
    @Operation(summary = "修改隐患排查(整改/验收)")
    @Log(title = "安全隐患", businessType = BusinessType.UPDATE)
    @PutMapping ()
    public R update(@RequestBody SafeHidden safeHidden) {
        return R.ok(safeHiddenService.updateById(safeHidden));
    }
    @Operation(summary = "删除隐患排查")
    @Log(title = "安全隐患", businessType = BusinessType.DELETE)
    @DeleteMapping("/{ids}")
    public R delSafeHidden(@RequestBody List<Integer> ids) {
        return R.ok(safeHiddenService.delSafeHidden(ids));
src/main/java/com/ruoyi/safe/controller/SafeHiddenFileController.java
@@ -2,6 +2,8 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.safe.pojo.SafeHiddenFile;
import com.ruoyi.safe.service.SafeHiddenFileService;
@@ -35,6 +37,7 @@
     * @param safeHiddenFile
     * @return
     */
    @Log(title = "新增隐患文件", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @Operation(summary = "新增")
    public R add(@RequestBody SafeHiddenFile safeHiddenFile) {
@@ -46,6 +49,7 @@
     * @param ids
     * @return
     */
    @Log(title = "删除隐患文件", businessType = BusinessType.DELETE)
    @DeleteMapping("/del")
    @Operation(summary = "删除")
    public R delSafeHiddenFile(@RequestBody List<Integer> ids) {
src/main/java/com/ruoyi/safe/controller/SafeTrainingController.java
@@ -1,6 +1,8 @@
package com.ruoyi.safe.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.safe.dto.SafeTrainingDto;
import com.ruoyi.safe.pojo.SafeTraining;
@@ -39,12 +41,14 @@
    }
    @Operation(summary = "新增/编辑安全培训考核")
    @Log(title = "安全培训", businessType = BusinessType.INSERT)
    @PostMapping()
    public R addOrUpdate(@RequestBody SafeTraining safeTraining) {
        return R.ok(safeTrainingService.addOrUpdate(safeTraining));
    }
    @Operation(summary = "签到")
    @Log(title = "安全培训", businessType = BusinessType.INSERT)
    @PostMapping ("/sign")
    public R sign(@RequestBody SafeTrainingDetails safeTrainingDetails) {
        return R.ok(safeTrainingDetailsService.save(safeTrainingDetails));
@@ -57,18 +61,21 @@
    }
    @Operation(summary = "结果明细保存")
    @Log(title = "安全培训", businessType = BusinessType.UPDATE)
    @PostMapping ("/saveSafeTraining")
    public R saveSafeTraining(@RequestBody SafeTrainingDto safeTrainingDto) {
        return R.ok(safeTrainingService.saveSafeTraining(safeTrainingDto));
    }
    @Operation(summary = "删除安全培训考核")
    @Log(title = "安全培训", businessType = BusinessType.DELETE)
    @DeleteMapping("/{ids}")
    public R delSafeTraining(@RequestBody List<Integer> ids) {
        return R.ok(safeTrainingService.delSafeTraining(ids));
    }
    @Operation(summary = "导出")
    @Log(title = "安全培训", businessType = BusinessType.EXPORT)
    @PostMapping ("/export")
    public void export(HttpServletResponse response, @RequestBody SafeTraining safeTraining) {
        safeTrainingService.export(response,safeTraining.getId());
src/main/java/com/ruoyi/safe/controller/SafeTrainingDetailsController.java
@@ -1,6 +1,8 @@
package com.ruoyi.safe.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.safe.pojo.SafeTrainingDetails;
import com.ruoyi.safe.service.SafeTrainingDetailsService;
@@ -33,6 +35,7 @@
        return R.ok(safeTrainingDetailsService.pageDetails(page, safeTrainingDetails));
    }
    @Log(title = "导出培训详情", businessType = BusinessType.EXPORT)
    @Operation(summary = "导出")
    @PostMapping("/export")
    public void export(HttpServletResponse response, @RequestBody SafeTrainingDetails safeTrainingDetails) {
src/main/java/com/ruoyi/safe/controller/SafeTrainingFileController.java
@@ -2,6 +2,8 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.safe.pojo.SafeHiddenFile;
import com.ruoyi.safe.pojo.SafeTrainingFile;
@@ -36,6 +38,7 @@
     * @param safeHiddenFile
     * @return
     */
    @Log(title = "新增培训文件", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @Operation(summary = "新增")
    public R add(@RequestBody SafeTrainingFile safeHiddenFile) {
@@ -47,6 +50,7 @@
     * @param ids
     * @return
     */
    @Log(title = "删除培训文件", businessType = BusinessType.DELETE)
    @DeleteMapping("/del")
    @Operation(summary = "删除")
    public R delSafeHiddenFile(@RequestBody List<Integer> ids) {
src/main/java/com/ruoyi/sales/controller/PaymentShippingController.java
@@ -4,6 +4,8 @@
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.OrderUtils;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.sales.mapper.PaymentShippingMapper;
@@ -37,6 +39,7 @@
        return AjaxResult.success(listPage);
    }
    @Log(title = "付款发货", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @Operation(summary = "添加支付与发货信息")
    @Transactional(rollbackFor = Exception.class)
@@ -47,6 +50,7 @@
        return save ? success() : error();
    }
    @Log(title = "付款发货", businessType = BusinessType.UPDATE)
    @PostMapping("/update")
    @Operation(summary = "修改支付与发货信息")
    @Transactional(rollbackFor = Exception.class)
@@ -55,6 +59,7 @@
        return update ? success() : error();
    }
    @Log(title = "付款发货", businessType = BusinessType.DELETE)
    @DeleteMapping("/delete")
    @Operation(summary = "删除支付与发货信息")
    @Transactional(rollbackFor = Exception.class)
src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java
@@ -3,6 +3,8 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.sales.dto.SalesQuotationDto;
import com.ruoyi.sales.service.SalesQuotationService;
@@ -21,6 +23,7 @@
    }
    @Log(title = "销售报价", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response) {
        Page page = new Page(-1,-1);
@@ -31,14 +34,17 @@
    }
    @Log(title = "销售报价", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public AjaxResult add(@RequestBody SalesQuotationDto salesQuotationDto) {
        return AjaxResult.success(salesQuotationService.add(salesQuotationDto));
    }
    @Log(title = "销售报价", businessType = BusinessType.UPDATE)
    @PostMapping("/update")
    public AjaxResult update(@RequestBody SalesQuotationDto salesQuotationDto) {
        return AjaxResult.success(salesQuotationService.edit(salesQuotationDto));
    }
    @Log(title = "销售报价", businessType = BusinessType.DELETE)
    @DeleteMapping("/delete")
    public AjaxResult delete(@RequestBody Long id) {
        return AjaxResult.success(salesQuotationService.delete(id));
src/main/java/com/ruoyi/sales/controller/SalespersonManagementController.java
@@ -2,6 +2,8 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.sales.pojo.SalespersonManagement;
@@ -33,6 +35,7 @@
        return AjaxResult.success(listPage);
    }
    @Log(title = "业务员管理", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @Operation(summary = "添加业务员信息")
    @Transactional(rollbackFor = Exception.class)
@@ -41,6 +44,7 @@
        return save ? AjaxResult.success() : AjaxResult.error();
    }
    @Log(title = "业务员管理", businessType = BusinessType.UPDATE)
    @PostMapping("/update")
    @Operation(summary = "修改业务员信息")
    @Transactional(rollbackFor = Exception.class)
@@ -49,6 +53,7 @@
        return update ? AjaxResult.success() : AjaxResult.error();
    }
    @Log(title = "业务员管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/delete")
    @Operation(summary = "删除业务员信息")
    @Transactional(rollbackFor = Exception.class)
src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
@@ -106,6 +106,7 @@
    /**
     * å¯¼å‡ºå‘货信息管理
     */
    @Log(title = "发货信息", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    @Operation(summary = "导出发货信息")
    public void export(HttpServletResponse response) {
src/main/java/com/ruoyi/sales/service/impl/MetricStatisticsServiceImpl.java
@@ -48,7 +48,7 @@
        // å‘货数量
        long count = shippingInfoMapper.selectCount(new LambdaQueryWrapper<ShippingInfo>()
                .in(ShippingInfo::getSalesLedgerProductId, salesLedgerProducts.stream().map(SalesLedgerProduct::getId).collect(Collectors.toList()))
                .eq(ShippingInfo::getStatus,"已发货"));
                .eq(ShippingInfo::getStatus,"审核通过"));
        map.put("shipRate", String.format("%.2f", count * 100.0 / salesLedgerProducts.size()) + "%");
        return AjaxResult.success(map);
    }
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -185,7 +185,11 @@
                    .orderByDesc(ShippingInfo::getCreateTime)
                    .last("limit 1"));
            if (shippingInfo != null) {
                product.setShippingCarNumber(shippingInfo.getShippingCarNumber());
                product.setShippingDate(shippingInfo.getShippingDate());
                product.setShippingStatus(shippingInfo.getStatus());
                product.setExpressCompany(shippingInfo.getExpressCompany());
                product.setExpressNumber(shippingInfo.getExpressNumber());
            }
        }
@@ -452,10 +456,12 @@
                        .eq(ShippingInfo::getSalesLedgerProductId, product.getId())
                        .orderByDesc(ShippingInfo::getCreateTime)
                        .last("limit 1"));
                product.setShippingCarNumber(shippingInfo.getShippingCarNumber());
                product.setShippingDate(shippingInfo.getShippingDate());
                if (shippingInfo != null) {
                    product.setShippingCarNumber(shippingInfo.getShippingCarNumber());
                    product.setShippingDate(shippingInfo.getShippingDate());
                    product.setShippingStatus(shippingInfo.getStatus());
                    product.setExpressCompany(shippingInfo.getExpressCompany());
                    product.setExpressNumber(shippingInfo.getExpressNumber());
                }
            }
            // è¿‡æ»¤åªä¿ç•™å‘货记录
src/main/java/com/ruoyi/sales/vo/CustomerTransactionsDetailsVo.java
@@ -24,10 +24,10 @@
    @Schema(description = "合同金额")
    private BigDecimal contractAmount;
    @Schema(description = "收款金额")
    private BigDecimal receiptPaymentAmount;
    @Schema(description = "已出库金额")
    private BigDecimal shippedAmount;
    @Schema(description = "应收金额")
    private BigDecimal receiptableAmount;
    @Schema(description = "未出库金额")
    private BigDecimal unshippedAmount;
}
src/main/java/com/ruoyi/sales/vo/CustomerTransactionsVo.java
@@ -16,15 +16,12 @@
    private String customerName;
    @Schema(description = "合同总金额")
    //该客户销售合同累计金额
    private BigDecimal contractAmounts;
    @Schema(description = "收款金额")
    //该客户销售收款累计金额
    private BigDecimal receiptPaymentAmount;
    @Schema(description = "已出库金额")
    private BigDecimal shippedAmount;
    @Schema(description = "应收金额")
    //该客户销售应收累计金额=财务(出库-退货)
    private BigDecimal receiptableAmount;
    @Schema(description = "未出库金额")
    private BigDecimal unshippedAmount;
}
src/main/java/com/ruoyi/staff/controller/HolidayApplicationController.java
@@ -1,6 +1,8 @@
package com.ruoyi.staff.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.staff.pojo.HolidayApplication;
import com.ruoyi.staff.service.HolidayApplicationService;
@@ -23,6 +25,7 @@
    /**
     * æ–°å¢žè¯·å‡ç”³è¯·
     */
    @Log(title = "新增请假申请", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public AjaxResult add(@RequestBody HolidayApplication holidayApplication){
        return AjaxResult.success(holidayApplicationService.save(holidayApplication));
@@ -30,6 +33,7 @@
    /**
     * ä¿®æ”¹è¯·å‡ç”³è¯·
     */
    @Log(title = "修改请假申请", businessType = BusinessType.UPDATE)
    @PostMapping("/update")
    public AjaxResult update(@RequestBody HolidayApplication holidayApplication){
        return AjaxResult.success(holidayApplicationService.updateById(holidayApplication));
@@ -37,6 +41,7 @@
    /**
     * åˆ é™¤è¯·å‡ç”³è¯·
     */
    @Log(title = "删除请假申请", businessType = BusinessType.DELETE)
    @DeleteMapping("/delete/{id}")
    public AjaxResult delete(@PathVariable("id") Long id){
        return AjaxResult.success(holidayApplicationService.removeById(id));
src/main/java/com/ruoyi/staff/controller/PersonalAttendanceLocationConfigController.java
@@ -1,6 +1,8 @@
package com.ruoyi.staff.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.staff.pojo.PersonalAttendanceLocationConfig;
import com.ruoyi.staff.service.PersonalAttendanceLocationConfigService;
@@ -28,6 +30,7 @@
    private final PersonalAttendanceLocationConfigService personalAttendanceLocationConfigService;
    @Operation(summary = "新增/修改人员打卡规则配置")
    @Log(title = "新增/修改人员打卡规则配置", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public R add(@RequestBody PersonalAttendanceLocationConfig personalAttendanceLocationConfig){
@@ -47,6 +50,7 @@
    @Operation(summary = "删除人员打卡规则配置")
    @Log(title = "删除人员打卡规则配置", businessType = BusinessType.DELETE)
    @DeleteMapping("/del")
    public R del(@RequestBody List<Integer> ids) {
        return R.ok(personalAttendanceLocationConfigService.removeBatchByIds(ids));
src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java
@@ -1,6 +1,8 @@
package com.ruoyi.staff.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.staff.dto.PersonalAttendanceRecordsDto;
import com.ruoyi.staff.pojo.PersonalAttendanceRecords;
@@ -27,6 +29,7 @@
    @Resource
    private PersonalAttendanceRecordsService personalAttendanceRecordsService;
    @Log(title = "个人考勤记录", businessType = BusinessType.INSERT)
    @Operation(summary = "新增打卡签到")
    @PostMapping("")
    public AjaxResult add(@RequestBody PersonalAttendanceRecordsDto personalAttendanceRecordsDto){
@@ -45,6 +48,7 @@
        return AjaxResult.success(personalAttendanceRecordsService.todayInfo(personalAttendanceRecordsDto));
    }
    @Log(title = "个人考勤记录", businessType = BusinessType.EXPORT)
    @Operation(summary = "导出打卡签到")
    @PostMapping("/export")
    public void export(HttpServletResponse response, PersonalAttendanceRecordsDto personalAttendanceRecordsDto) {
src/main/java/com/ruoyi/staff/controller/PersonalShiftController.java
@@ -4,6 +4,8 @@
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.staff.dto.PerformanceShiftAddDto;
import com.ruoyi.staff.pojo.PersonalAttendanceLocationConfig;
@@ -42,6 +44,7 @@
    private PersonalShiftService personalShiftService;
    @Operation(summary = "人员排班")
    @Log(title = "新增人员排班", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public R add(@RequestBody PerformanceShiftAddDto performanceShiftAddDto){
        return R.ok(personalShiftService.performanceShiftAdd(performanceShiftAddDto));
@@ -60,6 +63,7 @@
    }
    @Operation(summary = "班次状态修改")
    @Log(title = "修改班次状态", businessType = BusinessType.UPDATE)
    @PostMapping("update")
    public R performanceShiftUpdate(@RequestBody PersonalShift personalShift) {
        personalShiftService.performanceShiftUpdate(personalShift);
@@ -67,6 +71,7 @@
    }
    @Operation(summary = "导出")
    @Log(title = "导出人员排班", businessType = BusinessType.EXPORT)
    @GetMapping("export")
    public void exportToExcel(@NotNull(message = "时间不能为空!") String time, String userName, Integer sysDeptId, Boolean isMonth, HttpServletResponse response) throws Exception {
        ServletOutputStream out = response.getOutputStream();
src/main/java/com/ruoyi/staff/controller/StaffLeaveController.java
@@ -1,6 +1,8 @@
package com.ruoyi.staff.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.staff.dto.StaffLeaveDto;
import com.ruoyi.staff.service.StaffLeaveService;
@@ -37,6 +39,7 @@
     * @param staffLeaveDto
     * @return
     */
    @Log(title = "新增离职记录", businessType = BusinessType.INSERT)
    @PostMapping("")
    public AjaxResult add(@RequestBody StaffLeaveDto staffLeaveDto) {
        return AjaxResult.success(staffLeaveService.add(staffLeaveDto));
@@ -48,6 +51,7 @@
     * @param staffLeaveDto
     * @return
     */
    @Log(title = "修改离职记录", businessType = BusinessType.UPDATE)
    @PutMapping("/{id}")
    public AjaxResult update(@PathVariable("id") Long id, @RequestBody StaffLeaveDto staffLeaveDto) {
        return AjaxResult.success(staffLeaveService.update(id, staffLeaveDto));
@@ -58,6 +62,7 @@
     * @param ids
     * @return
     */
    @Log(title = "删除离职记录", businessType = BusinessType.DELETE)
    @DeleteMapping("/del")
    public AjaxResult del(@RequestBody List<Integer> ids) {
        if(CollectionUtils.isEmpty(ids)){
@@ -70,6 +75,7 @@
     * ç¦»èŒå¯¼å‡º
     * @param staffLeaveDto
     */
    @Log(title = "导出离职记录", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, StaffLeaveDto staffLeaveDto) {
        staffLeaveService.export(response, staffLeaveDto);
src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
@@ -57,6 +57,7 @@
     * @param staffOnJob
     * @return
     */
    @Log(title = "在职员工", businessType = BusinessType.INSERT)
    @PostMapping("")
    public AjaxResult add(@RequestBody StaffOnJobDto staffOnJob) {
        return AjaxResult.success(staffOnJobService.add(staffOnJob));
@@ -67,6 +68,7 @@
     * @param staffOnJobDto
     * @return
     */
    @Log(title = "在职员工", businessType = BusinessType.UPDATE)
    @PutMapping("/{id}")
    public AjaxResult update(@PathVariable("id") Long id, @RequestBody StaffOnJobDto staffOnJobDto) {
        return AjaxResult.success(staffOnJobService.update(id, staffOnJobDto));
@@ -77,6 +79,7 @@
     * @param ids
     * @return
     */
    @Log(title = "在职员工", businessType = BusinessType.DELETE)
    @DeleteMapping("/del")
    public AjaxResult delStaffOnJobs(@RequestBody List<Integer> ids) {
        if(CollectionUtils.isEmpty(ids)){
@@ -101,12 +104,14 @@
     * @param staffContract
     * @return
     */
    @Log(title = "在职员工", businessType = BusinessType.UPDATE)
    @PostMapping("/renewContract/{id}")
    public AjaxResult renewContract(@PathVariable Long id, @RequestBody StaffContract staffContract) {
        return AjaxResult.success(staffOnJobService.renewContract(id, staffContract));
    }
    @Operation(summary = "下载模板")
    @Log(title = "在职员工", businessType = BusinessType.EXPORT)
    @PostMapping("/downloadTemplate")
    public void downloadTemplate(HttpServletResponse response) {
        ExcelUtil<StaffOnJobExcelDto> util = new ExcelUtil<>(StaffOnJobExcelDto.class);
@@ -131,6 +136,7 @@
     * @param response
     * @param staffOnJob
     */
    @Log(title = "在职员工", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void staffOnJobExport(HttpServletResponse response,StaffOnJob staffOnJob) {
        staffOnJobService.staffOnJobExport(response, staffOnJob);
@@ -141,6 +147,7 @@
     * @param response
     * @param staffOnJob
     */
    @Log(title = "在职员工", businessType = BusinessType.EXPORT)
    @PostMapping("/exportCopy")
    @Operation(summary = "word模板合同在职员工导出")
    public AjaxResult exportCopy(HttpServletResponse response,@RequestBody StaffOnJob staffOnJob) throws Exception{
src/main/java/com/ruoyi/staff/controller/StaffSchedulingController.java
@@ -35,18 +35,21 @@
       return AjaxResult.success(staffSchedulingService.listPage(vo));
    }
    @Log(title = "员工排班", businessType = BusinessType.INSERT)
    @PostMapping("/save")
    public AjaxResult save(@RequestBody @Validated SaveStaffSchedulingDto saveStaffSchedulingDto){
        staffSchedulingService.saveStaffScheduling(saveStaffSchedulingDto);
        return AjaxResult.success();
    }
    @Log(title = "员工排班", businessType = BusinessType.DELETE)
    @DeleteMapping("/delByIds")
    public AjaxResult delByIds(@RequestBody List<Integer> ids){
        staffSchedulingService.removeByIds(ids);
        return AjaxResult.success();
    }
    @Log(title = "员工排班", businessType = BusinessType.DELETE)
    @DeleteMapping("/del/{id}")
    public AjaxResult del(@PathVariable("id") Integer id){
        staffSchedulingService.removeById(id);
src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java
@@ -4,6 +4,8 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.stock.dto.StockInventoryDto;
import com.ruoyi.stock.dto.StockUninventoryDto;
@@ -36,6 +38,7 @@
    @PostMapping("/addstockUninventory")
    @Operation(summary = "新增库存")
    @Log(title = "新增不合格库存", businessType = BusinessType.INSERT)
    public R addstockUninventory(@RequestBody StockUninventoryDto stockUninventoryDto) {
        stockUninventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_IN.getCode()));
        stockUninventoryDto.setRecordId(0L);
@@ -45,6 +48,7 @@
    @PostMapping("/subtractstockUninventory")
    @Operation(summary = "扣减库存")
    @Log(title = "扣减不合格库存", businessType = BusinessType.UPDATE)
    public R subtractstockUninventory(@RequestBody StockUninventoryDto stockUninventoryDto) {
        stockUninventoryDto.setRecordType(String.valueOf(StockOutQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode()));
        stockUninventoryDto.setRecordId(0L);
@@ -53,6 +57,7 @@
    @PostMapping("/addStockInRecordOnly")
    @Operation(summary = "新增入库记录(仅创建记录,不调整库存)")
    @Log(title = "新增不合格库存入库记录", businessType = BusinessType.INSERT)
    public R addStockInRecordOnly(@RequestBody StockUninventoryDto stockUninventoryDto) {
        stockUninventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_IN.getCode()));
        stockUninventoryDto.setRecordId(0L);
@@ -61,6 +66,7 @@
    @PostMapping("/addStockOutRecordOnly")
    @Operation(summary = "新增出库记录(仅创建记录,不调整库存)")
    @Log(title = "新增不合格库存出库记录", businessType = BusinessType.INSERT)
    public R addStockOutRecordOnly(@RequestBody StockUninventoryDto stockUninventoryDto) {
        stockUninventoryDto.setRecordType(String.valueOf(StockOutQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode()));
        stockUninventoryDto.setRecordId(0L);
@@ -69,6 +75,7 @@
    @PostMapping("/exportStockUninventory")
    @Operation(summary = "导出库存")
    @Log(title = "导出不合格库存", businessType = BusinessType.EXPORT)
    public void exportStockUninventory(HttpServletResponse response, StockUninventoryDto stockUninventoryDto) {
        stockUninventoryService.exportStockUninventory(response,stockUninventoryDto);
    }
@@ -76,12 +83,14 @@
    @PostMapping("/frozenStock")
    @Operation(summary = "冻结库存")
    @Log(title = "冻结不合格库存", businessType = BusinessType.UPDATE)
    public R frozenStock(@RequestBody StockInventoryDto stockInventoryDto) {
        return R.ok(stockUninventoryService.frozenStock(stockInventoryDto));
    }
    @PostMapping("/thawStock")
    @Operation(summary = "解冻库存")
    @Log(title = "解冻不合格库存", businessType = BusinessType.UPDATE)
    public R thawStock(@RequestBody StockInventoryDto stockInventoryDto) {
        return R.ok(stockUninventoryService.thawStock(stockInventoryDto));
    }
src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
@@ -7,14 +7,17 @@
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@TableName("stock_in_record")
@Schema(name = "入库管理")
public class StockInRecord {
public class StockInRecord implements Serializable {
    @Serial
    private static final long serialVersionUID = 1L;
    /**
     * åºå·
@@ -44,6 +47,7 @@
    private String remark;
    @Schema(description = "预警数量")
    @TableField(exist = false)
    private BigDecimal warnNum;
    @Schema(description = "类型  0合格入库 1不合格入库")
src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -69,9 +69,56 @@
            throw new BaseException("该入库记录不存在,无法更新!!!");
        }
        // è®°å½•修改前的 batch_no
        String oldBatchNo = stockInRecord.getBatchNo();
        String newBatchNo = stockInRecordDto.getBatchNo();
        String[] ignoreProperties = {"id", "inbound_batches"};//排除id属性
        BeanUtils.copyProperties(stockInRecordDto, stockInRecord, ignoreProperties);
        return stockInRecordMapper.updateById(stockInRecord);
        int result = stockInRecordMapper.updateById(stockInRecord);
        // å¦‚æžœ batch_no å‘生变化,需要同步更新关联表
        if (newBatchNo != null && !newBatchNo.equals(oldBatchNo)) {
            updateRelatedBatchNo(stockInRecord, oldBatchNo, newBatchNo);
        }
        return result;
    }
    /**
     * åŒæ­¥æ›´æ–°å…³è”表的 batch_no
     * @param stockInRecord å…¥åº“记录
     * @param oldBatchNo ä¿®æ”¹å‰çš„æ‰¹å·
     * @param newBatchNo ä¿®æ”¹åŽçš„æ‰¹å·
     */
    private void updateRelatedBatchNo(StockInRecord stockInRecord, String oldBatchNo, String newBatchNo) {
        // 1. æ›´æ–° stock_inventory è¡¨ï¼ˆåˆæ ¼åº“存)
        LambdaQueryWrapper<StockInventory> inventoryEq = new LambdaQueryWrapper<StockInventory>()
                .eq(StockInventory::getProductModelId, stockInRecord.getProductModelId());
        if (StringUtils.isEmpty(oldBatchNo)) {
            inventoryEq.isNull(StockInventory::getBatchNo);
        } else {
            inventoryEq.eq(StockInventory::getBatchNo, oldBatchNo);
        }
        StockInventory stockInventory = stockInventoryMapper.selectOne(inventoryEq);
        if (stockInventory != null) {
            stockInventory.setBatchNo(newBatchNo);
            stockInventoryMapper.updateById(stockInventory);
        }
        // 2. æ›´æ–° stock_uninventory è¡¨ï¼ˆä¸åˆæ ¼åº“存)
        LambdaQueryWrapper<StockUninventory> uninventoryEq = new LambdaQueryWrapper<StockUninventory>()
                .eq(StockUninventory::getProductModelId, stockInRecord.getProductModelId());
        if (StringUtils.isEmpty(oldBatchNo)) {
            uninventoryEq.isNull(StockUninventory::getBatchNo);
        } else {
            uninventoryEq.eq(StockUninventory::getBatchNo, oldBatchNo);
        }
        StockUninventory stockUninventory = stockUninventoryMapper.selectOne(uninventoryEq);
        if (stockUninventory != null) {
            stockUninventory.setBatchNo(newBatchNo);
            stockUninventoryMapper.updateById(stockUninventory);
        }
    }
    @Override
src/main/java/com/ruoyi/technology/controller/TechnologyBomStructureController.java
@@ -1,5 +1,7 @@
package com.ruoyi.technology.controller;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.technology.bean.dto.TechnologyBomStructureDto;
import com.ruoyi.technology.bean.vo.TechnologyBomStructureVo;
@@ -21,6 +23,7 @@
    @PostMapping
    @Operation(summary = "新增或修改BOM结构")
    @Log(title = "新增或修改BOM结构", businessType = BusinessType.INSERT)
    public R addOrUpdate(@RequestBody TechnologyBomStructureDto technologyBomStructureDto) {
        return R.ok(technologyBomStructureService.addTechnologyBomStructure(technologyBomStructureDto));
    }
src/main/java/com/ruoyi/technology/controller/TechnologyRoutingController.java
@@ -2,6 +2,8 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.technology.bean.dto.TechnologyRoutingDto;
import com.ruoyi.technology.bean.vo.TechnologyRoutingVo;
@@ -43,8 +45,9 @@
    /**
     * æ–°å¢žå·¥è‰ºè·¯çº¿ã€‚
     */
    @PostMapping("/addTechRoute")
    @Log(title = "工艺路线", businessType = BusinessType.INSERT)
    @Operation(summary = "新增工艺路线")
    @PostMapping("/addTechRoute")
    public R add(@RequestBody TechnologyRouting technologyRouting) {
        return R.ok(technologyRoutingService.saveTechnologyRouting(technologyRouting));
    }
@@ -52,8 +55,9 @@
    /**
     * ä¿®æ”¹å·¥è‰ºè·¯çº¿ã€‚
     */
    @PutMapping("/editTechRoute")
    @Log(title = "工艺路线", businessType = BusinessType.UPDATE)
    @Operation(summary = "修改工艺路线")
    @PutMapping("/editTechRoute")
    public R edit(@RequestBody TechnologyRouting technologyRouting) {
        return R.ok(technologyRoutingService.updateTechnologyRouting(technologyRouting));
    }
@@ -61,8 +65,9 @@
    /**
     * æ‰¹é‡åˆ é™¤å·¥è‰ºè·¯çº¿ã€‚
     */
    @DeleteMapping("/delete")
    @Log(title = "工艺路线", businessType = BusinessType.DELETE)
    @Operation(summary = "删除工艺路线")
    @DeleteMapping("/delete")
    public R remove(@RequestBody List<Long> ids) {
        return R.ok(technologyRoutingService.removeTechnologyRouting(ids));
    }
src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationController.java
@@ -2,6 +2,8 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.technology.bean.dto.TechnologyRoutingOperationDto;
import com.ruoyi.technology.bean.vo.TechnologyRoutingOperationVo;
@@ -41,26 +43,30 @@
        return R.ok(technologyRoutingOperationService.getTechnologyRoutingOperationInfo(id));
    }
    @PostMapping("/add")
    @Log(title = "工艺路线工序", businessType = BusinessType.INSERT)
    @Operation(summary = "新增工艺路线工序")
    @PostMapping("/add")
    public R add(@RequestBody TechnologyRoutingOperation technologyRoutingOperation) {
        return R.ok(technologyRoutingOperationService.saveTechnologyRoutingOperation(technologyRoutingOperation));
    }
    @PutMapping
    @Log(title = "工艺路线工序", businessType = BusinessType.UPDATE)
    @Operation(summary = "修改工艺路线工序")
    @PutMapping
    public R edit(@RequestBody TechnologyRoutingOperation technologyRoutingOperation) {
        return R.ok(technologyRoutingOperationService.updateById(technologyRoutingOperation));
    }
    @DeleteMapping("/{id}")
    @Log(title = "工艺路线工序", businessType = BusinessType.DELETE)
    @Operation(summary = "删除工艺路线工序")
    @DeleteMapping("/{id}")
    public R remove(@PathVariable("id") Long id) {
        return R.ok(technologyRoutingOperationService.removeTechnologyRoutingOperation(id));
    }
    @PostMapping ("/sort")
    @Log(title = "工艺路线工序", businessType = BusinessType.UPDATE)
    @Operation(summary = "排序工艺路线工序")
    @PostMapping ("/sort")
    public R sort(@RequestBody TechnologyRoutingOperation technologyRoutingOperation) {
        return R.ok(technologyRoutingOperationService.sort(technologyRoutingOperation));
    }
src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationParamController.java
@@ -2,6 +2,8 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.technology.bean.dto.TechnologyRoutingOperationParamDto;
import com.ruoyi.technology.bean.dto.TechnologyRoutingOperationParamSyncDto;
@@ -44,24 +46,28 @@
    @PostMapping("/add")
    @Operation(summary = "新增生产订单工艺路线工序参数")
    @Log(title = "新增工艺路线工序参数", businessType = BusinessType.INSERT)
    public R<Boolean> add(@RequestBody TechnologyRoutingOperationParam technologyRoutingOperationParam) {
        return R.ok(technologyRoutingOperationParamService.saveTechnologyRoutingOperationParam(technologyRoutingOperationParam));
    }
    @PutMapping
    @Operation(summary = "修改生产订单工艺路线工序参数")
    @Log(title = "修改工艺路线工序参数", businessType = BusinessType.UPDATE)
    public R<Boolean> edit(@RequestBody TechnologyRoutingOperationParam technologyRoutingOperationParam) {
        return R.ok(technologyRoutingOperationParamService.saveTechnologyRoutingOperationParam(technologyRoutingOperationParam));
    }
    @DeleteMapping("/{id}")
    @Operation(summary = "删除生产订单工艺路线工序参数")
    @Log(title = "删除工艺路线工序参数", businessType = BusinessType.DELETE)
    public R<Boolean> remove(@PathVariable("id") Long id) {
        return R.ok(technologyRoutingOperationParamService.removeTechnologyRoutingOperationParam(id));
    }
    @PostMapping("/sync")
    @Operation(summary = "按工艺路线工序同步工序参数")
    @Log(title = "同步工艺路线工序参数", businessType = BusinessType.UPDATE)
    public R<Integer> sync(@RequestBody TechnologyRoutingOperationParamSyncDto syncDto) {
        return R.ok(technologyRoutingOperationParamService.syncTechnologyRoutingOperationParam(syncDto));
    }
src/main/java/com/ruoyi/warehouse/controller/DocumentationFileController.java
@@ -1,5 +1,7 @@
package com.ruoyi.warehouse.controller;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.warehouse.pojo.DocumentationFile;
import com.ruoyi.warehouse.service.DocumentationFileService;
@@ -25,6 +27,7 @@
     * @param documentationFile
     * @return
     */
    @Log(title = "新增文档文件", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public AjaxResult add(@RequestBody DocumentationFile documentationFile) {
        return AjaxResult.success(documentationFileService.save(documentationFile));
@@ -35,6 +38,7 @@
     * @param ids
     * @return
     */
    @Log(title = "删除文档文件", businessType = BusinessType.DELETE)
    @DeleteMapping("/del")
    public AjaxResult delDocumentationFile(@RequestBody List<Long> ids) {
        if(CollectionUtils.isEmpty(ids)){
src/main/resources/application-zqsy.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,255 @@
# é¡¹ç›®ç›¸å…³é…ç½®
ruoyi:
  # åç§°
  name: RuoYi
  # ç‰ˆæœ¬
  version: 3.8.9
  # ç‰ˆæƒå¹´ä»½
  copyrightYear: 2025
  # æ–‡ä»¶è·¯å¾„ ç¤ºä¾‹ï¼ˆ Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
  profile: /javaWork/product-inventory-management/file
  # èŽ·å–ip地址开关
  addressEnabled: false
  # éªŒè¯ç ç±»åž‹ math æ•°å­—计算 char å­—符验证
  captchaType: math
  # ååŒå®¡æ‰¹ç¼–号前缀(配置文件后缀命名)
  approvalNumberPrefix: NEW
  # ä¸ªæŽ¨ Unipush é…ç½®
  getui:
    appId: PfjyAAE0FK64FaO1w2CMb1
    appKey: zTMb831OEL6J4GK1uE3Ob4
    masterSecret: K1GFtsv42v61tXGnF7SGE5
    domain: https://restapi.getui.cn/v2/
    # ç¦»çº¿æŽ¨é€ä½¿ç”¨çš„包名/组件名
    intentComponent: uni.app.UNI099A590/io.dcloud.PandoraEntry
# å¼€å‘环境配置
server:
  # æœåŠ¡å™¨çš„HTTP端口,默认为8080
  port: 9003
  servlet:
    # åº”用的访问路径
    context-path: /
  tomcat:
    # tomcat的URI编码
    uri-encoding: UTF-8
    # è¿žæŽ¥æ•°æ»¡åŽçš„æŽ’队数,默认为100
    accept-count: 1000
    threads:
      # tomcat最大线程数,默认为200
      max: 800
      # Tomcat启动初始化的线程数,默认值10
      min-spare: 100
# æ—¥å¿—配置
logging:
  level:
    com.ruoyi: warn
    org.springframework: warn
minio:
  endpoint: http://114.132.189.42/
  port: 7019
  secure: false
  accessKey: admin
  secretKey: 12345678
  preview-expiry: 24 # é¢„览地址默认24小时
  default-bucket: jxc
# ç”¨æˆ·é…ç½®
user:
  password:
    # å¯†ç æœ€å¤§é”™è¯¯æ¬¡æ•°
    maxRetryCount: 5
    # å¯†ç é”å®šæ—¶é—´ï¼ˆé»˜è®¤10分钟)
    lockTime: 10
# Spring配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://172.17.0.1:9002/product-inventory-management-zqsy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: zqsy@123456..
      # ä»Žåº“数据源
      slave:
        # ä»Žæ•°æ®æºå¼€å…³/默认关闭
        enabled: false
        url:
        username:
        password:
      # åˆå§‹è¿žæŽ¥æ•°
      initialSize: 5
      # æœ€å°è¿žæŽ¥æ± æ•°é‡
      minIdle: 10
      # æœ€å¤§è¿žæŽ¥æ± æ•°é‡
      maxActive: 20
      # é…ç½®èŽ·å–è¿žæŽ¥ç­‰å¾…è¶…æ—¶çš„æ—¶é—´
      maxWait: 60000
      # é…ç½®è¿žæŽ¥è¶…æ—¶æ—¶é—´
      connectTimeout: 30000
      # é…ç½®ç½‘络超时时间
      socketTimeout: 60000
      # é…ç½®é—´éš”多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å°ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
      minEvictableIdleTimeMillis: 300000
      # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å¤§ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
      maxEvictableIdleTimeMillis: 900000
      # é…ç½®æ£€æµ‹è¿žæŽ¥æ˜¯å¦æœ‰æ•ˆ
      validationQuery: SELECT 1 FROM DUAL
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      webStatFilter:
        enabled: true
      statViewServlet:
        enabled: true
        # è®¾ç½®ç™½åå•,不填则允许所有访问
        allow:
        url-pattern: /druid/*
        # æŽ§åˆ¶å°ç®¡ç†ç”¨æˆ·åå’Œå¯†ç 
        login-username: ruoyi
        login-password: 123456
      filter:
        stat:
          enabled: true
          # æ…¢SQL记录
          log-slow-sql: true
          slow-sql-millis: 1000
          merge-sql: true
        wall:
          config:
            multi-statement-allow: true
  # èµ„源信息
  messages:
    # å›½é™…化资源文件路径
    basename: i18n/messages
  # æ–‡ä»¶ä¸Šä¼ 
  servlet:
    multipart:
      # å•个文件大小
      max-file-size: 1GB
      # è®¾ç½®æ€»ä¸Šä¼ çš„æ–‡ä»¶å¤§å°
      max-request-size: 2GB
  # æœåŠ¡æ¨¡å—
  devtools:
    restart:
      # çƒ­éƒ¨ç½²å¼€å…³
      enabled: false
  # redis é…ç½®
  redis:
    # åœ°å€
    #    host: 127.0.0.1
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
    database: 0
    # å¯†ç 
    #    password: root2022!
    password:
    # è¿žæŽ¥è¶…æ—¶æ—¶é—´
    timeout: 10s
    lettuce:
      pool:
        # è¿žæŽ¥æ± ä¸­çš„æœ€å°ç©ºé—²è¿žæŽ¥
        min-idle: 0
        # è¿žæŽ¥æ± ä¸­çš„æœ€å¤§ç©ºé—²è¿žæŽ¥
        max-idle: 8
        # è¿žæŽ¥æ± çš„æœ€å¤§æ•°æ®åº“连接数
        max-active: 8
        # #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms
  # Quartz定时任务配置(新增部分)
  quartz:
    job-store-type: jdbc  # ä½¿ç”¨æ•°æ®åº“存储
    jdbc:
      initialize-schema: never  # é¦–次运行时自动创建表结构,成功后改为never
      schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql  # MySQL表结构脚本
    properties:
      org:
        quartz:
          scheduler:
            instanceName: RuoYiScheduler
            instanceId: AUTO
          jobStore:
            class: org.quartz.impl.jdbcjobstore.JobStoreTX
            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate  # MySQL适配
            tablePrefix: qrtz_  # è¡¨åå‰ç¼€ï¼Œä¸Žè„šæœ¬ä¸€è‡´
            isClustered: false  # å•节点模式(集群需改为true)
            clusterCheckinInterval: 10000
            txIsolationLevelSerializable: true
          threadPool:
            class: org.quartz.simpl.SimpleThreadPool
            threadCount: 10  # çº¿ç¨‹æ± å¤§å°
            threadPriority: 5
            makeThreadsDaemons: true
          updateCheck: false  # å…³é—­ç‰ˆæœ¬æ£€æŸ¥
# token配置
token:
  # ä»¤ç‰Œè‡ªå®šä¹‰æ ‡è¯†
  header: Authorization
  # ä»¤ç‰Œå¯†é’¥
  secret: abcdefghijklmnopqrstuvwxyz
  # ä»¤ç‰Œæœ‰æ•ˆæœŸï¼ˆé»˜è®¤30分钟)
  expireTime: 450
# MyBatis Plus配置
mybatis-plus:
  # æœç´¢æŒ‡å®šåŒ…别名   æ ¹æ®è‡ªå·±çš„项目来
  typeAliasesPackage: com.ruoyi.**.pojo
  # é…ç½®mapper的扫描,找到所有的mapper.xml映射文件
  mapperLocations: classpath*:mapper/**/*Mapper.xml
  # åŠ è½½å…¨å±€çš„é…ç½®æ–‡ä»¶
  configLocation: classpath:mybatis/mybatis-config.xml
  global-config:
    enable-sql-runner: true
    db-config:
      id-type: auto
# PageHelper分页插件
pagehelper:
  helperDialect: mysql
  supportMethodsArguments: true
  params: count=countSql
# Swagger配置
swagger:
  # æ˜¯å¦å¼€å¯swagger
  enabled: true
  # è¯·æ±‚前缀
  pathMapping: /dev-api
# é˜²æ­¢XSS攻击
xss:
  # è¿‡æ»¤å¼€å…³
  enabled: true
  # æŽ’除链接(多个用逗号分隔)
  excludes: /system/notice
  # åŒ¹é…é“¾æŽ¥
  urlPatterns: /system/*,/monitor/*,/tool/*
# ä»£ç ç”Ÿæˆ
gen:
  # ä½œè€…
  author: ruoyi
  # é»˜è®¤ç”ŸæˆåŒ…路径 system éœ€æ”¹æˆè‡ªå·±çš„æ¨¡å—名称 å¦‚ system monitor tool
  packageName: com.ruoyi.project.system
  # è‡ªåŠ¨åŽ»é™¤è¡¨å‰ç¼€ï¼Œé»˜è®¤æ˜¯true
  autoRemovePre: false
  # è¡¨å‰ç¼€ï¼ˆç”Ÿæˆç±»åä¸ä¼šåŒ…含表前缀,多个用逗号分隔)
  tablePrefix: sys_
  # æ˜¯å¦å…è®¸ç”Ÿæˆæ–‡ä»¶è¦†ç›–到本地(自定义路径),默认不允许
  allowOverwrite: false
file:
  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
src/main/resources/mapper/approve/ApproveProcessMapper.xml
@@ -29,16 +29,19 @@
        approve_user_names,approve_reason,approve_time,approve_over_time,approve_status,
        approve_delete,tenant_id,approve_type,approve_remark,start_date_time,end_date_time
    </sql>
    <select id="listPage" resultType="com.ruoyi.approve.vo.ApproveProcessVo">
        select * from approve_process where approve_delete = 0
        <if test="req.approveId != null and req.approveId != ''">
            and approve_id like concat('%',#{req.approveId},'%')
        </if>
        <if test="req.approveStatus != null or req.approveStatus == 0">
        <if test="req.approveStatus != null">
            and approve_status = #{req.approveStatus}
        </if>
        <if test="req.approveType != null ">
            and approve_type = #{req.approveType}
        </if>
        order by approve_time desc
    </select>
</mapper>
src/main/resources/mapper/basic/CustomerMapper.xml
@@ -9,9 +9,9 @@
    <select id="listPage" resultType="com.ruoyi.basic.vo.CustomerVo">
        select
        c.*,
        u.user_name usage_user_name,
        u.nick_name as usage_user_name,
        (
        select group_concat(u2.user_name separator ', ')
        select group_concat(u2.nick_name separator ', ')
        from customer_user cu
        left join sys_user u2 on cu.user_id = u2.user_id
        where cu.customer_id = c.id
@@ -107,14 +107,14 @@
            </if>
        </where>
    </select>
    <select id="customewTransactions" resultType="com.ruoyi.sales.vo.CustomerTransactionsVo">
        select T1.customer_id,
               c.customer_name,
               T1.contractAmounts,
               IFNULL(T2.receiptPaymentAmount, 0) AS receiptPaymentAmount,
               IFNULL(T3.outboundAmount, 0) - IFNULL(T4.returnAmount, 0) AS receiptableAmount
               IFNULL(T3.outboundAmount, 0) AS shippedAmount,
               GREATEST(T1.contractAmounts - IFNULL(T3.outboundAmount, 0), 0) AS unshippedAmount
        from (select customer_id, sum(contract_amount) as contractAmounts from sales_ledger group by customer_id) T1
        left join (select customer_id, sum(collection_amount) as receiptPaymentAmount from account_sales_collection group by customer_id) T2 on T1.customer_id = T2.customer_id
        left join (
            SELECT
                sl.customer_id,
@@ -128,16 +128,6 @@
                and slp.type = 1
            group by sl.customer_id
        ) T3 on T3.customer_id=T1.customer_id
        left join (
            select
                sl.customer_id,
                sum(rm.refund_amount) as returnAmount
            from return_management rm
            left join shipping_info si on rm.shipping_id = si.id
            left join sales_ledger sl on si.sales_ledger_id = sl.id
            where rm.status=1
            group by sl.customer_id
        ) T4 on T4.customer_id=T1.customer_id
        left join customer c on T1.customer_id = c.id
        <where>
            <if test="customerName!=null and customerName!=''">
@@ -145,27 +135,16 @@
            </if>
        </where>
    </select>
    <select id="customewTransactionsDetails"
            resultType="com.ruoyi.sales.vo.CustomerTransactionsDetailsVo">
        select sl.id salesLedgerId,
               sl.sales_contract_no,
               sl.execution_date,
               sl.contract_amount,
               IFNULL(T1.receiptPaymentAmount, 0) AS receiptPaymentAmount,
               IFNULL(T2.outboundAmount, 0) - IFNULL(T3.returnAmount, 0) AS receiptableAmount
               IFNULL(T2.outboundAmount, 0) AS shippedAmount,
               GREATEST(sl.contract_amount - IFNULL(T2.outboundAmount, 0), 0) AS unshippedAmount
        from sales_ledger sl
        left join (
            select
                sl.id,
                sum(ascc.collection_amount) as receiptPaymentAmount
            from account_sales_collection ascc
            left join stock_out_record sor on FIND_IN_SET(sor.id, ascc.stock_out_record_ids) > 0
            left join shipping_info s on sor.record_id = s.id
            LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id
            WHERE sor.record_type='13'
              and sor.approval_status=1
            group by  sl.id
        )T1 on T1.id = sl.id
        left join (
            SELECT
                sl.id,
@@ -179,15 +158,6 @@
              and slp.type = 1
            group by  sl.id
        )T2 on T2.id = sl.id
        left join (
            select sl.id,
                   sum(rm.refund_amount) as returnAmount
            from return_management rm
                     left join shipping_info si on rm.shipping_id = si.id
                     left join sales_ledger sl on si.sales_ledger_id = sl.id
            where rm.status=1
            group by sl.id
        )T3 on T3.id = sl.id
        where sl.customer_id = #{customerId}
    </select>
</mapper>
src/main/resources/mapper/basic/SupplierManageMapper.xml
@@ -68,95 +68,69 @@
            </if>
        </where>
    </select>
    <select id="supplierTransactions" resultType="com.ruoyi.purchase.vo.SupplierTransactionsVo">
        select T1.supplier_id,
        SELECT T1.supplier_id,
               sm.supplier_name,
               T1.contractAmounts,
               IFNULL(T2.paymentAmount, 0) AS paymentAmount,
               IFNULL(T3.InboundAmount, 0) - IFNULL(T4.returnAmount, 0) AS payableAmount
        from (select supplier_id, sum(contract_amount) as contractAmounts from purchase_ledger group by supplier_id) T1
        left join (select supplier_id, sum(payment_amount) as paymentAmount from account_purchase_payment group by supplier_id) T2 on T1.supplier_id = T2.supplier_id
        left join (
            SELECT
                pl.supplier_id,
                sum(sir.stock_in_num * slp.tax_inclusive_unit_price) AS InboundAmount
            FROM stock_in_record sir
                     -- 10 ç±»åž‹æ‰å…³è”质检表
                     LEFT JOIN quality_inspect qi ON sir.record_type = 10 AND sir.record_id = qi.id
                -- åŠ¨æ€å…³è”é‡‡è´­ï¼ˆè‡ªåŠ¨é€‚é… 7 å’Œ 10)
                     LEFT JOIN purchase_ledger pl
                               ON pl.id = IF(sir.record_type = 7, sir.record_id, qi.purchase_ledger_id)
                -- äº§å“å…³è”不动
                     LEFT JOIN sales_ledger_product slp ON pl.id = slp.sales_ledger_id
            -- æ¡ä»¶
            WHERE sir.approval_status = 1 AND slp.type = 2
              AND sir.record_type IN ('7','10')
            group by pl.supplier_id
        ) T3 on T3.supplier_id=T1.supplier_id
        left join (
            select
                supplier_id,
                sum(total_amount) as returnAmount
            from purchase_return_orders pro
            group by supplier_id
        ) T4 on T4.supplier_id=T1.supplier_id
        left join supplier_manage sm on T1.supplier_id = sm.id
               IFNULL(T3.InboundAmount, 0) AS shippedAmount,
               T1.contractAmounts - IFNULL(T3.InboundAmount, 0) AS unshippedAmount
        FROM (SELECT supplier_id, SUM(contract_amount) AS contractAmounts FROM purchase_ledger GROUP BY supplier_id) T1
        LEFT JOIN (
            SELECT t.supplier_id,
                   SUM(t.inbound_amount) AS InboundAmount
            FROM (
                SELECT sir.stock_in_num * slp.tax_inclusive_unit_price AS inbound_amount, pl.supplier_id
                FROM stock_in_record sir
                INNER JOIN sales_ledger_product slp ON slp.id = sir.record_id
                INNER JOIN purchase_ledger pl ON pl.id = slp.sales_ledger_id
                WHERE sir.approval_status = 1 AND sir.record_type = 7 AND slp.type = 2
                UNION ALL
                SELECT sir.stock_in_num * slp.tax_inclusive_unit_price AS inbound_amount, pl.supplier_id
                FROM stock_in_record sir
                INNER JOIN quality_inspect qi ON qi.id = sir.record_id
                INNER JOIN purchase_ledger pl ON pl.id = qi.purchase_ledger_id
                INNER JOIN sales_ledger_product slp ON slp.sales_ledger_id = pl.id AND slp.product_model_id = sir.product_model_id
                WHERE sir.approval_status = 1 AND sir.record_type = 10 AND slp.type = 2
            ) t
            GROUP BY t.supplier_id
        ) T3 ON T3.supplier_id = T1.supplier_id
        LEFT JOIN supplier_manage sm ON T1.supplier_id = sm.id
        <where>
            <if test="supplierName!=null and supplierName!=''">
                AND sm.supplier_name LIKE CONCAT('%',#{supplierName},'%')
            </if>
        </where>
    </select>
    <select id="supplierTransactionsDetails"
            resultType="com.ruoyi.purchase.vo.SupplierTransactionsDetailsVo">
       select pl.id  purchaseLedgerId,
       SELECT pl.id purchaseLedgerId,
              pl.purchase_contract_number,
              pl.execution_date,
              pl.contract_amount,
              IFNULL(T1.paymentAmount, 0) AS paymentAmount,
              IFNULL(T2.InboundAmount, 0) - IFNULL(T3.returnAmount, 0) AS payableAmount
       from purchase_ledger pl
       left join (
           select
               pl.id,
               sum(app.payment_amount) as paymentAmount
           from account_purchase_payment app
           left join account_payment_application apa on app.account_payment_application_id = apa.id
           left join stock_in_record sir on FIND_IN_SET(sir.id, apa.stock_in_record_ids) > 0
               -- 10 ç±»åž‹æ‰å…³è”质检表
           LEFT JOIN quality_inspect qi ON sir.record_type = 10 AND sir.record_id = qi.id
               -- åŠ¨æ€å…³è”é‡‡è´­ï¼ˆè‡ªåŠ¨é€‚é… 7 å’Œ 10)
           LEFT JOIN purchase_ledger pl
                     ON pl.id = IF(sir.record_type = 7, sir.record_id, qi.purchase_ledger_id)
           WHERE sir.approval_status = 1
             AND sir.record_type IN ('7','10')
           group by pl.id
       )T1 on T1.id = pl.id
       left join (
           SELECT
               pl.id,
               sum(sir.stock_in_num * slp.tax_inclusive_unit_price) AS InboundAmount
           FROM stock_in_record sir
                    -- 10 ç±»åž‹æ‰å…³è”质检表
                    LEFT JOIN quality_inspect qi ON sir.record_type = 10 AND sir.record_id = qi.id
               -- åŠ¨æ€å…³è”é‡‡è´­ï¼ˆè‡ªåŠ¨é€‚é… 7 å’Œ 10)
                    LEFT JOIN purchase_ledger pl
                              ON pl.id = IF(sir.record_type = 7, sir.record_id, qi.purchase_ledger_id)
               -- äº§å“å…³è”不动
                    LEFT JOIN sales_ledger_product slp ON pl.id = slp.sales_ledger_id
           -- æ¡ä»¶
           WHERE sir.approval_status = 1 AND slp.type = 2
             AND sir.record_type IN ('7','10')
           group by pl.id
       )T2 on T2.id = pl.id
       left join (
           select pl.id,
                  sum(pro.total_amount) as returnAmount
           from purchase_return_orders pro
                    left join purchase_ledger pl on pro.purchase_ledger_id = pl.id
           group by pl.id
       )T3 on T3.id = pl.id
       where pl.supplier_id = #{supplierId}
              IFNULL(T2.InboundAmount, 0) AS shippedAmount,
              pl.contract_amount - IFNULL(T2.InboundAmount, 0) AS unshippedAmount
       FROM purchase_ledger pl
       LEFT JOIN (
           SELECT t.sales_ledger_id,
                  SUM(t.inbound_amount) AS InboundAmount
           FROM (
               SELECT sir.stock_in_num * slp.tax_inclusive_unit_price AS inbound_amount, slp.sales_ledger_id
               FROM stock_in_record sir
               INNER JOIN sales_ledger_product slp ON slp.id = sir.record_id
               WHERE sir.approval_status = 1 AND sir.record_type = 7 AND slp.type = 2
               UNION ALL
               SELECT sir.stock_in_num * slp.tax_inclusive_unit_price AS inbound_amount, slp.sales_ledger_id
               FROM stock_in_record sir
               INNER JOIN quality_inspect qi ON qi.id = sir.record_id
               INNER JOIN purchase_ledger pl2 ON pl2.id = qi.purchase_ledger_id
               INNER JOIN sales_ledger_product slp ON slp.sales_ledger_id = pl2.id AND slp.product_model_id = sir.product_model_id
               WHERE sir.approval_status = 1 AND sir.record_type = 10 AND slp.type = 2
           ) t
           GROUP BY t.sales_ledger_id
       ) T2 ON T2.sales_ledger_id = pl.id
       WHERE pl.supplier_id = #{supplierId}
    </select>
</mapper>
src/main/resources/mapper/device/DeviceMaintenanceMapper.xml
@@ -26,31 +26,41 @@
        left join device_ledger dl on dm.device_ledger_id = dl.id
        left join sys_user su on dm.create_user = su.user_id
        <where>
            1 = 1
            <if test="deviceMaintenanceDto.deviceName != null">
                and dl.device_name like concat('%',#{deviceMaintenanceDto.deviceName},'%')
            <if test="deviceMaintenanceDto.deviceName != null and deviceMaintenanceDto.deviceName != ''">
                and dl.device_name like concat('%', #{deviceMaintenanceDto.deviceName}, '%')
            </if>
            <if test="deviceMaintenanceDto.deviceModel != null">
                and dl.device_model like concat('%',#{deviceMaintenanceDto.deviceModel},'%')
            <if test="deviceMaintenanceDto.deviceModel != null and deviceMaintenanceDto.deviceModel != ''">
                and dl.device_model like concat('%', #{deviceMaintenanceDto.deviceModel}, '%')
            </if>
            <if test="deviceMaintenanceDto.status != null">
                and dm.status = #{deviceMaintenanceDto.status}
            </if>
            <if test="deviceMaintenanceDto.maintenanceActuallyName != null">
                and dm.maintenance_actually_name like concat('%',#{deviceMaintenanceDto.maintenanceActuallyName},'%')
            <if test="deviceMaintenanceDto.maintenanceActuallyName != null and deviceMaintenanceDto.maintenanceActuallyName != ''">
                and dm.maintenance_actually_name like concat('%', #{deviceMaintenanceDto.maintenanceActuallyName}, '%')
            </if>
            <if test="deviceMaintenanceDto.maintenancePlanTime != null">
                and dm.maintenance_plan_time like concat('%',#{deviceMaintenanceDto.maintenancePlanTime},'%')
                and dm.maintenance_plan_time = #{deviceMaintenanceDto.maintenancePlanTime}
            </if>
            <if test="deviceMaintenanceDto.maintenanceActuallyTime != null">
                and dm.maintenance_actually_time like concat('%',#{deviceMaintenanceDto.maintenanceActuallyTime},'%')
            </if>
            <if test="deviceMaintenanceDto.maintenanceActuallyTime != null">
                and dm.maintenance_actually_time >= str_to_date(#{deviceMaintenanceDto.maintenanceActuallyTime}, '%Y-%m-%d')
                and dm.maintenance_actually_time &lt; date_add(str_to_date(#{deviceMaintenanceDto.maintenanceActuallyTime}, '%Y-%m-%d'), interval 1 day)
                and dm.maintenance_actually_time &gt;= str_to_date(#{deviceMaintenanceDto.maintenanceActuallyTime},
                '%Y-%m-%d')
                and dm.maintenance_actually_time &lt;
                date_add(str_to_date(#{deviceMaintenanceDto.maintenanceActuallyTime}, '%Y-%m-%d'), interval 1 day)
            </if>
        </where>
        order by
        <!--    å¾…保养(0)优先排在上面,已完结(1)在下面 -->
        dm.status asc,
        case
        <!-- å½“状态是 0(待保养)时,按计划时间升序,即时间最远的单子在最上面 -->
        when dm.status = 0 then dm.maintenance_plan_time
        end asc,
        case
        <!-- å½“状态是 1(已完结)时,按实际保养时间降序,最近刚保养完的单子在已完结里排最前 -->
        when dm.status = 1 then dm.maintenance_actually_time
        end desc
    </select>
    <select id="detailById" resultType="com.ruoyi.device.vo.DeviceMaintenanceVo">
        select dm.id,
               dm.device_ledger_id,
src/main/resources/mapper/production/ProductionOperationTaskMapper.xml
@@ -123,9 +123,9 @@
            <if test="endDateTime != null">
                and ppo.create_time &lt;= #{endDateTime}
            </if>
            <if test="userId != null">
                and ppm.create_user = #{userId}
            </if>
<!--            <if test="userId != null">-->
<!--                and ppm.create_user = #{userId}-->
<!--            </if>-->
            <if test="processIds != null and processIds.size() > 0">
                and poro.technology_operation_id in
                <foreach collection="processIds" item="id" open="(" separator="," close=")">
src/main/resources/mapper/production/ProductionOrderMapper.xml
@@ -134,7 +134,7 @@
        <include refid="ProductionOrderVoColumns" />
        <include refid="ProductionOrderVoFrom" />
        <include refid="ProductionOrderWhere" />
        order by po.id desc
        order by po.nps_no desc
    </select>
    <select id="listProductionOrder" resultMap="ProductionOrderVoResultMap">
src/main/resources/mapper/production/ProductionPlanMapper.xml
@@ -58,7 +58,7 @@
                </if>
            </if>
        </where>
        ORDER BY COALESCE(pp.id) DESC
        ORDER BY pp.mps_no DESC
    </select>
    <select id="selectWithMaterialByIds" resultType="com.ruoyi.production.bean.dto.ProductionPlanDto">
src/main/resources/mapper/quality/QualityInspectMapper.xml
@@ -110,73 +110,38 @@
    </select>
    <select id="getPassRateStatistics" resultType="com.ruoyi.quality.dto.QualityPassRateDto">
        SELECT qi.inspect_type AS modelType,
        SELECT t.modelType,
               t.totalCount,
               t.completedCount,
               t.qualifiedCount,
               t.unqualifiedCount,
               COALESCE(SUM(qi.quantity), 0) AS totalCount,
            /* å®ŒæˆçŽ‡ï¼š
               å¦‚果总数为 0 åˆ™è¿”回 0;否则计算比例,使用 TRUNCATE ä¿ç•™ 4 ä½å°æ•°ï¼ˆå¦‚ 99.9992)
            */
               IF(t.totalCount = 0, 0,
                  TRUNCATE((t.completedCount / t.totalCount) * 100, 2)
               ) AS completionRate,
               COALESCE(SUM(
                                CASE
                                    WHEN qi.inspect_state = 1 THEN qi.quantity
                                    ELSE 0
                                    END
                        ), 0)                AS completedCount,
               COALESCE(SUM(
                                CASE
                                    WHEN qi.inspect_state = 1
                                        THEN qi.qualified_quantity
                                    ELSE 0
                                    END
                        ), 0)                AS qualifiedCount,
               COALESCE(SUM(
                                CASE
                                    WHEN qi.inspect_state = 1
                                        THEN qi.unqualified_quantity
                                    ELSE 0
                                    END
                        ), 0)                AS unqualifiedCount,
            /* å®Œæˆçއ */
               IF(COALESCE(SUM(qi.quantity), 0) = 0, 0,
                  ROUND(
                          COALESCE(SUM(
                                           CASE
                                               WHEN qi.inspect_state = 1 THEN qi.quantity
                                               ELSE 0
                                               END
                                   ), 0)
                              / SUM(qi.quantity) * 100, 2)
               )                             AS completionRate,
            /* åˆæ ¼çއ */
               IF(COALESCE(SUM(
                                   CASE
                                       WHEN qi.inspect_state = 1 THEN qi.quantity
                                       ELSE 0
                                       END
                           ), 0) = 0, 0,
                  ROUND(
                          COALESCE(SUM(
                                           CASE
                                               WHEN qi.inspect_state = 1
                                                   THEN qi.qualified_quantity
                                               ELSE 0
                                               END
                                   ), 0)
                              /
                          COALESCE(SUM(
                                           CASE
                                               WHEN qi.inspect_state = 1 THEN qi.quantity
                                               ELSE 0
                                               END
                                   ), 0) * 100, 2)
               )                             AS passRate
        FROM quality_inspect qi
        GROUP BY qi.inspect_type
        ORDER BY qi.inspect_type;
            /* åˆæ ¼çŽ‡ï¼š
               å¦‚果完工数为 0 åˆ™è¿”回 0;使用 TRUNCATE æˆªæ–­ï¼Œé˜²æ­¢æžå…¶æŽ¥è¿‘ 100% çš„æ•°æ®è¢«å››èˆäº”入成 100
            */
               IF(t.completedCount = 0, 0,
                  TRUNCATE((t.qualifiedCount / t.completedCount) * 100, 2)
               ) AS passRate
        FROM (
                 /* å…ˆé€šè¿‡å­æŸ¥è¯¢æŠŠåŸºç¡€æ•°æ®è¿›è¡Œèšåˆç»Ÿè®¡ï¼Œé¿å…å¤–层重复编写复杂的 CASE WHEN */
                 SELECT qi.inspect_type                                                                          AS modelType,
                        COALESCE(SUM(qi.quantity), 0)                                                            AS totalCount,
                        COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END),
                                 0)                                                                              AS completedCount,
                        COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.qualified_quantity ELSE 0 END),
                                 0)                                                                              AS qualifiedCount,
                        COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.unqualified_quantity ELSE 0 END),
                                 0)                                                                              AS unqualifiedCount
                 FROM quality_inspect qi
                 GROUP BY qi.inspect_type) t
        ORDER BY t.modelType;
    </select>
@@ -196,88 +161,52 @@
                     FROM months m
                              CROSS JOIN types t)
        SELECT CASE b.month_num
                   WHEN 1 THEN '一月'
                   WHEN 2 THEN '二月'
                   WHEN 3 THEN '三月'
                   WHEN 4 THEN '四月'
                   WHEN 5 THEN '五月'
                   WHEN 6 THEN '六月'
                   WHEN 7 THEN '七月'
                   WHEN 8 THEN '八月'
                   WHEN 9 THEN '九月'
                   WHEN 10 THEN '十月'
                   WHEN 11 THEN '十一月'
                   WHEN 12 THEN '十二月'
                   END                       AS month,
        SELECT
            CASE t.month_num
                WHEN 1 THEN '一月'
                WHEN 2 THEN '二月'
                WHEN 3 THEN '三月'
                WHEN 4 THEN '四月'
                WHEN 5 THEN '五月'
                WHEN 6 THEN '六月'
                WHEN 7 THEN '七月'
                WHEN 8 THEN '八月'
                WHEN 9 THEN '九月'
                WHEN 10 THEN '十月'
                WHEN 11 THEN '十一月'
                WHEN 12 THEN '十二月'
                END AS month,
               b.modelType,
        t.modelType,
        t.totalCount,
        t.completedCount,
        t.qualifiedCount,
        t.unqualifiedCount,
            /* æ€»æ•°é‡ */
               COALESCE(SUM(qi.quantity), 0) AS totalCount,
        IF(t.totalCount = 0, 0,
           TRUNCATE((t.completedCount / t.totalCount) * 100, 2)
        ) AS completionRate,
            /* å·²å®Œæˆ */
               COALESCE(SUM(
                                CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END
                        ), 0)                AS completedCount,
        IF(t.completedCount = 0, 0,
           TRUNCATE((t.qualifiedCount / t.completedCount) * 100, 2)
        ) AS passRate
            /* åˆæ ¼ */
               COALESCE(SUM(
                                CASE
                                    WHEN qi.inspect_state = 1
                                        THEN qi.qualified_quantity
                                    ELSE 0
                                    END
                        ), 0)                AS qualifiedCount,
            /* ä¸åˆæ ¼ */
               COALESCE(SUM(
                                CASE
                                    WHEN qi.inspect_state = 1
                                        THEN qi.unqualified_quantity
                                    ELSE 0
                                    END
                        ), 0)                AS unqualifiedCount,
            /* å®Œæˆçއ */
               IF(COALESCE(SUM(qi.quantity), 0) = 0, 0,
                  ROUND(
                          COALESCE(SUM(
                                           CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END
                                   ), 0) / SUM(qi.quantity) * 100, 2
                  )
               )                             AS completionRate,
            /* åˆæ ¼çއ */
               IF(COALESCE(SUM(
                                   CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END
                           ), 0) = 0, 0,
                  ROUND(
                          COALESCE(SUM(
                                           CASE
                                               WHEN qi.inspect_state = 1
                                                   THEN qi.qualified_quantity
                                               ELSE 0
                                               END
                                   ), 0)
                              /
                          COALESCE(SUM(
                                           CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END
                                   ), 0) * 100, 2
                  )
               )                             AS passRate
        FROM base b
                 LEFT JOIN quality_inspect qi
                           ON qi.inspect_type = b.modelType
                               AND YEAR(qi.check_time) = #{year}
                               AND MONTH(qi.check_time) = b.month_num
        GROUP BY b.month_num, b.modelType
        ORDER BY b.month_num, b.modelType;
        FROM (
            SELECT
            b.month_num,
            b.modelType,
            COALESCE(SUM(qi.quantity), 0) AS totalCount,
            COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END), 0) AS completedCount,
            COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.qualified_quantity ELSE 0 END), 0) AS qualifiedCount,
            COALESCE(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.unqualified_quantity ELSE 0 END), 0) AS unqualifiedCount
            FROM base b
            LEFT JOIN quality_inspect qi ON qi.inspect_type = b.modelType
            AND YEAR(qi.check_time) = #{year}
            AND MONTH(qi.check_time) = b.month_num
            GROUP BY b.month_num, b.modelType
            ) t
        ORDER BY t.month_num, t.modelType;
    </select>
    <select id="getYearlyPassRateStatistics" resultType="com.ruoyi.quality.dto.QualityPassRateDto">
        SELECT qi.inspect_type AS modelType,
src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -207,7 +207,7 @@
            JOIN product pr ON slp.product_id = pr.id
        WHERE
            slp.type = 2
            AND pr.parent_id = ( SELECT id FROM product WHERE product_name = '原材料' )
            AND pr.parent_id = ( SELECT id FROM product WHERE product_name = '原料' )
        GROUP BY
            pr.id,
            pr.product_name
@@ -218,20 +218,36 @@
    <select id="selectProductCountByTypeAndDate" resultType="int">
        SELECT IFNULL(COUNT(*), 0)
        FROM sales_ledger_product
        FROM sales_ledger_product slp
        LEFT JOIN sales_ledger sl ON sl.id = slp.sales_ledger_id
        LEFT JOIN purchase_ledger pl ON pl.id = slp.sales_ledger_id
        WHERE type = #{type}
        <if test="startDate != null">
            AND register_date &gt;= #{startDate}
        </if>
        <if test="endDate != null">
            AND register_date &lt;= #{endDate}
        </if>
        <choose>
            <when test="type == 1">
                <if test="startDate != null">
                    AND sl.entry_date &gt;= #{startDate}
                </if>
                <if test="endDate != null">
                    AND sl.entry_date &lt;= #{endDate}
                </if>
            </when>
            <when test="type == 2">
                <if test="startDate != null">
                    AND pl.entry_date &gt;= #{startDate}
                </if>
                <if test="endDate != null">
                    AND pl.entry_date &lt;= #{endDate}
                </if>
            </when>
        </choose>
    </select>
    <select id="selectRawMaterialExpense" resultType="java.math.BigDecimal">
        WITH RECURSIVE product_tree AS (SELECT id
                                        FROM product
                                        WHERE product_name = '原材料'
                                        WHERE product_name = '原料'
                                        UNION ALL
src/main/resources/mapper/stock/StockInRecordMapper.xml
@@ -132,7 +132,7 @@
                and p.id in (select id from product_tree)
            </if>
        </where>
        order by sir.id desc
        order by sir.create_time desc
    </select>
    <select id="listStockInRecordExportData" resultType="com.ruoyi.stock.execl.StockInRecordExportData">
        SELECT
@@ -159,7 +159,7 @@
                and sir.record_type = #{params.recordType}
            </if>
        </where>
        order by sir.id desc
        order by sir.create_time desc
    </select>
    <select id="listPageAccountPurchase" resultType="com.ruoyi.account.bean.vo.purchase.PurchaseInboundVo">
        SELECT
src/main/resources/mapper/stock/StockOutRecordMapper.xml
@@ -62,7 +62,7 @@
                and p.id in (select id from product_tree)
            </if>
        </where>
        order by sor.id desc
        order by sor.create_time desc
    </select>
    <select id="listStockOutRecordExportData" resultType="com.ruoyi.stock.execl.StockOutRecordExportData">
        SELECT
src/main/resources/mapper/system/SysUserMapper.xml
@@ -1,159 +1,192 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.project.system.mapper.SysUserMapper">
    <resultMap type="com.ruoyi.project.system.domain.SysUser" id="SysUserResult">
        <id     property="userId"       column="user_id"      />
        <result property="userName"     column="user_name"    />
        <result property="nickName"     column="nick_name"    />
        <result property="email"        column="email"        />
        <result property="phonenumber"  column="phonenumber"  />
        <result property="sex"          column="sex"          />
        <result property="avatar"       column="avatar"       />
        <result property="password"     column="password"     />
        <result property="status"       column="status"       />
        <result property="delFlag"      column="del_flag"     />
        <result property="aiEnabled"    column="ai_enabled"   />
        <result property="loginIp"      column="login_ip"     />
        <result property="loginDate"    column="login_date"   />
        <result property="createBy"     column="create_by"    />
        <result property="createTime"   column="create_time"  />
        <result property="updateBy"     column="update_by"    />
        <result property="updateTime"   column="update_time"  />
        <result property="remark"       column="remark"       />
        <result property="deptNames"       column="dept_names"       />
        <result property="tenantId"       column="tenant_id"       />
        <association property="dept"    javaType="com.ruoyi.project.system.domain.SysDept"         resultMap="deptResult" />
        <collection  property="roles"   javaType="java.util.List"  resultMap="RoleResult" />
        <id property="userId" column="user_id"/>
        <result property="userName" column="user_name"/>
        <result property="nickName" column="nick_name"/>
        <result property="email" column="email"/>
        <result property="phonenumber" column="phonenumber"/>
        <result property="sex" column="sex"/>
        <result property="avatar" column="avatar"/>
        <result property="password" column="password"/>
        <result property="status" column="status"/>
        <result property="delFlag" column="del_flag"/>
        <result property="aiEnabled" column="ai_enabled"/>
        <result property="loginIp" column="login_ip"/>
        <result property="loginDate" column="login_date"/>
        <result property="createBy" column="create_by"/>
        <result property="createTime" column="create_time"/>
        <result property="updateBy" column="update_by"/>
        <result property="updateTime" column="update_time"/>
        <result property="remark" column="remark"/>
        <result property="deptNames" column="dept_names"/>
        <result property="tenantId" column="tenant_id"/>
        <association property="dept" javaType="com.ruoyi.project.system.domain.SysDept" resultMap="deptResult"/>
        <collection property="roles" javaType="java.util.List" resultMap="RoleResult"/>
    </resultMap>
    <resultMap id="deptResult" type="com.ruoyi.project.system.domain.SysDept">
        <id     property="deptId"    column="dept_id"     />
        <result property="parentId"  column="parent_id"   />
        <result property="deptName"  column="dept_name"   />
        <result property="ancestors" column="ancestors"   />
        <result property="orderNum"  column="order_num"   />
        <result property="leader"    column="leader"      />
        <result property="status"    column="dept_status" />
        <id property="deptId" column="dept_id"/>
        <result property="parentId" column="parent_id"/>
        <result property="deptName" column="dept_name"/>
        <result property="ancestors" column="ancestors"/>
        <result property="orderNum" column="order_num"/>
        <result property="leader" column="leader"/>
        <result property="status" column="dept_status"/>
    </resultMap>
    <resultMap id="RoleResult" type="com.ruoyi.project.system.domain.SysRole">
        <id     property="roleId"       column="role_id"        />
        <result property="roleName"     column="role_name"      />
        <result property="roleKey"      column="role_key"       />
        <result property="roleSort"     column="role_sort"      />
        <result property="dataScope"    column="data_scope"     />
        <result property="status"       column="role_status"    />
        <id property="roleId" column="role_id"/>
        <result property="roleName" column="role_name"/>
        <result property="roleKey" column="role_key"/>
        <result property="roleSort" column="role_sort"/>
        <result property="dataScope" column="data_scope"/>
        <result property="status" column="role_status"/>
    </resultMap>
    <sql id="selectUserVo">
        select u.user_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.ai_enabled, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
        r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status,u.tenant_id
    <sql id="selectUserVo">
        select u.user_id,
               u.user_name,
               u.nick_name,
               u.email,
               u.avatar,
               u.phonenumber,
               u.password,
               u.sex,
               u.status,
               u.del_flag,
               u.ai_enabled,
               u.login_ip,
               u.login_date,
               u.create_by,
               u.create_time,
               u.remark,
               r.role_id,
               r.role_name,
               r.role_key,
               r.role_sort,
               r.data_scope,
               r.status as role_status,
               u.tenant_id
        from sys_user u
            left join sys_user_role ur on u.user_id = ur.user_id
            left join sys_role r on r.role_id = ur.role_id
                 left join sys_user_role ur on u.user_id = ur.user_id
                 left join sys_role r on r.role_id = ur.role_id
    </sql>
    <select id="selectUserList" parameterType="com.ruoyi.project.system.domain.SysUser" resultMap="SysUserResult">
        select u.user_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,T2.dept_names from sys_user u
        left join
        (    SELECT T1.user_id,GROUP_CONCAT(T2.dept_name SEPARATOR ', ') AS dept_names
            FROM
                sys_user_dept T1
            LEFT JOIN sys_dept T2 ON T1.dept_id = T2.dept_id
        <where>
            <if test="tenantId != null and tenantId != 0">
                T1.dept_id = #{tenantId}
            </if>
        </where>
            GROUP BY T1.user_id
        ) T2 on T2.user_id = u.user_id
        where u.del_flag = '0'
        <if test="userId != null and userId != 0">
            AND u.user_id = #{userId}
        </if>
        <if test="userName != null and userName != ''">
            AND u.user_name like concat('%', #{userName}, '%')
        </if>
        <if test="status != null and status != ''">
            AND u.status = #{status}
        </if>
        <if test="phonenumber != null and phonenumber != ''">
            AND u.phonenumber like concat('%', #{phonenumber}, '%')
        </if>
        <if test="params.beginTime != null and params.beginTime != ''"><!-- å¼€å§‹æ—¶é—´æ£€ç´¢ -->
            AND date_format(u.create_time,'%Y%m%d') &gt;= date_format(#{params.beginTime},'%Y%m%d')
        </if>
        <if test="params.endTime != null and params.endTime != ''"><!-- ç»“束时间检索 -->
            AND date_format(u.create_time,'%Y%m%d') &lt;= date_format(#{params.endTime},'%Y%m%d')
        </if>
        <if test="deptId != null">
            AND u.user_id IN
            (
            SELECT user_id FROM sys_user_dept WHERE dept_id = #{deptId}
            )
        </if>
        <!-- æ•°æ®èŒƒå›´è¿‡æ»¤ -->
        ${params.dataScope}
    </select>
        select u.user_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag,
        u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,T2.dept_names from sys_user u
        left join
        ( SELECT T1.user_id,GROUP_CONCAT(T2.dept_name SEPARATOR ', ') AS dept_names
        FROM
        sys_user_dept T1
        LEFT JOIN sys_dept T2 ON T1.dept_id = T2.dept_id
        <where>
            <if test="tenantId != null and tenantId != 0">
                T1.dept_id = #{tenantId}
            </if>
        </where>
        GROUP BY T1.user_id
        ) T2 on T2.user_id = u.user_id
        where u.del_flag = '0'
        <if test="userId != null and userId != 0">
            AND u.user_id = #{userId}
        </if>
        <if test="userName != null and userName != ''">
            AND u.user_name like concat('%', #{userName}, '%')
        </if>
        <if test="status != null and status != ''">
            AND u.status = #{status}
        </if>
        <if test="phonenumber != null and phonenumber != ''">
            AND u.phonenumber like concat('%', #{phonenumber}, '%')
        </if>
        <if test="params.beginTime != null and params.beginTime != ''"><!-- å¼€å§‹æ—¶é—´æ£€ç´¢ -->
            AND date_format(u.create_time,'%Y%m%d') &gt;= date_format(#{params.beginTime},'%Y%m%d')
        </if>
        <if test="params.endTime != null and params.endTime != ''"><!-- ç»“束时间检索 -->
            AND date_format(u.create_time,'%Y%m%d') &lt;= date_format(#{params.endTime},'%Y%m%d')
        </if>
        <if test="deptId != null">
            AND u.user_id IN
            (
            SELECT user_id FROM sys_user_dept WHERE dept_id = #{deptId}
            )
        </if>
        <!-- æ•°æ®èŒƒå›´è¿‡æ»¤ -->
        ${params.dataScope}
    </select>
    <select id="selectAllocatedList" parameterType="com.ruoyi.project.system.domain.SysUser" resultMap="SysUserResult">
        select distinct u.user_id,  u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time
        from sys_user u
             left join sys_user_role ur on u.user_id = ur.user_id
             left join sys_role r on r.role_id = ur.role_id
        where u.del_flag = '0' and r.role_id = #{roleId}
        <if test="userName != null and userName != ''">
            AND u.user_name like concat('%', #{userName}, '%')
        </if>
        <if test="phonenumber != null and phonenumber != ''">
            AND u.phonenumber like concat('%', #{phonenumber}, '%')
        </if>
        <!-- æ•°æ®èŒƒå›´è¿‡æ»¤ -->
        ${params.dataScope}
    </select>
    <select id="selectAllocatedList" parameterType="com.ruoyi.project.system.domain.SysUser" resultMap="SysUserResult">
        select distinct u.user_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time
        from sys_user u
        left join sys_user_role ur on u.user_id = ur.user_id
        left join sys_role r on r.role_id = ur.role_id
        where u.del_flag = '0' and r.role_id = #{roleId}
        <if test="userName != null and userName != ''">
            AND u.user_name like concat('%', #{userName}, '%')
        </if>
        <if test="phonenumber != null and phonenumber != ''">
            AND u.phonenumber like concat('%', #{phonenumber}, '%')
        </if>
        <!-- æ•°æ®èŒƒå›´è¿‡æ»¤ -->
        ${params.dataScope}
    </select>
    <select id="selectUnallocatedList" parameterType="com.ruoyi.project.system.domain.SysUser" resultMap="SysUserResult">
        select distinct u.user_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time
        from sys_user u
             left join sys_user_role ur on u.user_id = ur.user_id
             left join sys_role r on r.role_id = ur.role_id
        where u.del_flag = '0' and (r.role_id != #{roleId} or r.role_id IS NULL)
        and u.user_id not in (select u.user_id from sys_user u inner join sys_user_role ur on u.user_id = ur.user_id and ur.role_id = #{roleId})
        <if test="userName != null and userName != ''">
            AND u.user_name like concat('%', #{userName}, '%')
        </if>
        <if test="phonenumber != null and phonenumber != ''">
            AND u.phonenumber like concat('%', #{phonenumber}, '%')
        </if>
        <!-- æ•°æ®èŒƒå›´è¿‡æ»¤ -->
        ${params.dataScope}
    </select>
    <select id="selectUnallocatedList" parameterType="com.ruoyi.project.system.domain.SysUser"
            resultMap="SysUserResult">
        select distinct u.user_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time
        from sys_user u
        left join sys_user_role ur on u.user_id = ur.user_id
        left join sys_role r on r.role_id = ur.role_id
        where u.del_flag = '0' and (r.role_id != #{roleId} or r.role_id IS NULL)
        and u.user_id not in (select u.user_id from sys_user u inner join sys_user_role ur on u.user_id = ur.user_id and
        ur.role_id = #{roleId})
        <if test="userName != null and userName != ''">
            AND u.user_name like concat('%', #{userName}, '%')
        </if>
        <if test="phonenumber != null and phonenumber != ''">
            AND u.phonenumber like concat('%', #{phonenumber}, '%')
        </if>
        <!-- æ•°æ®èŒƒå›´è¿‡æ»¤ -->
        ${params.dataScope}
    </select>
    <select id="selectUserByUserName" parameterType="String" resultMap="SysUserResult">
        <include refid="selectUserVo"/>
        where u.user_name = #{userName} and u.del_flag = '0'
    </select>
    <select id="selectUserByUserName" parameterType="String" resultMap="SysUserResult">
        <include refid="selectUserVo"/>
        where u.user_name = #{userName} and u.del_flag = '0'
    </select>
    <select id="selectUserById" parameterType="Long" resultMap="SysUserResult">
        <include refid="selectUserVo"/>
        where u.user_id = #{userId}
        and u.del_flag = '0'
    </select>
    <select id="selectUserById" parameterType="Long" resultMap="SysUserResult">
        <include refid="selectUserVo"/>
        where u.user_id = #{userId}
        and u.del_flag = '0'
    </select>
    <select id="checkUserNameUnique" parameterType="String" resultMap="SysUserResult">
        select user_id, user_name from sys_user where user_name = #{userName} and del_flag = '0' limit 1
    </select>
    <select id="checkUserNameUnique" parameterType="String" resultMap="SysUserResult">
        select user_id, user_name
        from sys_user
        where user_name = #{userName}
          and del_flag = '0' limit 1
    </select>
    <select id="checkPhoneUnique" parameterType="String" resultMap="SysUserResult">
        select user_id, phonenumber from sys_user where phonenumber = #{phonenumber} and del_flag = '0' limit 1
    </select>
    <select id="checkPhoneUnique" parameterType="String" resultMap="SysUserResult">
        select user_id, phonenumber
        from sys_user
        where phonenumber = #{phonenumber}
          and del_flag = '0' limit 1
    </select>
    <select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult">
        select user_id, email from sys_user where email = #{email} and del_flag = '0' limit 1
    </select>
    <select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult">
        select user_id, email
        from sys_user
        where email = #{email}
          and del_flag = '0' limit 1
    </select>
    <select id="selectUserByIds" resultType="com.ruoyi.project.system.domain.SysUser">
        <include refid="selectUserVo"/>
        <where>
@@ -166,145 +199,154 @@
            and u.del_flag = '0'
        </where>
    </select>
    <select id="selectRegistrantIds" resultType="com.ruoyi.project.system.domain.SysUser">
        SELECT user_id, nick_name FROM sys_user
        <where>
            <if test="list != null and list.size() > 0">
                user_id IN
                <foreach item="id" collection="list" open="(" separator="," close=")">
                    #{id}
                </foreach>
            </if>
            <if test="list == null or list.size() == 0">
                1=0  <!-- ç©ºåˆ—表时返回空结果 -->
            </if>
        </where>
    </select>
    <select id="selectUsersByIds" resultType="com.ruoyi.project.system.domain.SysUser">
        SELECT user_id, nick_name
        FROM sys_user
        WHERE user_id IN
        <foreach collection="userIds" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>
        and del_flag = '0'
    </select>
    <select id="selectUserByNickName" resultType="com.ruoyi.project.system.domain.SysUser"
            parameterType="java.lang.String">
        <include refid="selectUserVo"/>
        where u.nick_name = #{nickName} and u.del_flag = '0'
        limit 1
    </select>
    <insert id="insertUser" parameterType="com.ruoyi.project.system.domain.SysUser" useGeneratedKeys="true" keyProperty="userId">
         insert into sys_user(
             <if test="userId != null and userId != 0">user_id,</if>
             <if test="userName != null and userName != ''">user_name,</if>
             <if test="nickName != null and nickName != ''">nick_name,</if>
             <if test="email != null and email != ''">email,</if>
             <if test="avatar != null and avatar != ''">avatar,</if>
             <if test="phonenumber != null and phonenumber != ''">phonenumber,</if>
             <if test="sex != null and sex != ''">sex,</if>
             <if test="password != null and password != ''">password,</if>
             <if test="status != null and status != ''">status,</if>
             <if test="createBy != null and createBy != ''">create_by,</if>
             <if test="remark != null and remark != ''">remark,</if>
            <if test="tenantId != null ">tenant_id,</if>
             create_time
         )values(
             <if test="userId != null and userId != ''">#{userId},</if>
             <if test="userName != null and userName != ''">#{userName},</if>
             <if test="nickName != null and nickName != ''">#{nickName},</if>
             <if test="email != null and email != ''">#{email},</if>
             <if test="avatar != null and avatar != ''">#{avatar},</if>
             <if test="phonenumber != null and phonenumber != ''">#{phonenumber},</if>
             <if test="sex != null and sex != ''">#{sex},</if>
             <if test="password != null and password != ''">#{password},</if>
             <if test="status != null and status != ''">#{status},</if>
             <if test="createBy != null and createBy != ''">#{createBy},</if>
             <if test="remark != null and remark != ''">#{remark},</if>
            <if test="tenantId != null ">#{tenantId},</if>
             sysdate()
         )
    </insert>
    <update id="updateUser" parameterType="com.ruoyi.project.system.domain.SysUser">
         update sys_user
         <set>
             <if test="nickName != null and nickName != ''">nick_name = #{nickName},</if>
             <if test="email != null ">email = #{email},</if>
             <if test="phonenumber != null ">phonenumber = #{phonenumber},</if>
             <if test="sex != null and sex != ''">sex = #{sex},</if>
             <if test="avatar != null and avatar != ''">avatar = #{avatar},</if>
             <if test="password != null and password != ''">password = #{password},</if>
             <if test="status != null and status != ''">status = #{status},</if>
             <if test="loginIp != null and loginIp != ''">login_ip = #{loginIp},</if>
             <if test="loginDate != null">login_date = #{loginDate},</if>
             <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
             <if test="remark != null">remark = #{remark},</if>
            <if test="tenantId != null">tenant_id = #{tenantId},</if>
             update_time = sysdate()
         </set>
         where user_id = #{userId}
    </update>
    <update id="updateUserStatus" parameterType="com.ruoyi.project.system.domain.SysUser">
         update sys_user set status = #{status} where user_id = #{userId}
    </update>
    <update id="updateUserAvatar" parameterType="com.ruoyi.project.system.domain.SysUser">
         update sys_user set avatar = #{avatar} where user_name = #{userName}
    </update>
    <update id="resetUserPwd" parameterType="com.ruoyi.project.system.domain.SysUser">
         update sys_user set password = #{password} where user_name = #{userName}
    </update>
    <delete id="deleteUserById" parameterType="Long">
         update sys_user set del_flag = '2' where user_id = #{userId}
     </delete>
     <delete id="deleteUserByIds" parameterType="Long">
         update sys_user set del_flag = '2' where user_id in
         <foreach collection="array" item="userId" open="(" separator="," close=")">
             #{userId}
    <select id="selectRegistrantIds" resultType="com.ruoyi.project.system.domain.SysUser">
        SELECT user_id, nick_name FROM sys_user
        <where>
            <if test="list != null and list.size() > 0">
                user_id IN
                <foreach item="id" collection="list" open="(" separator="," close=")">
                    #{id}
                </foreach>
            </if>
            <if test="list == null or list.size() == 0">
                1=0  <!-- ç©ºåˆ—表时返回空结果 -->
            </if>
        </where>
    </select>
    <select id="selectUsersByIds" resultType="com.ruoyi.project.system.domain.SysUser">
        SELECT user_id, nick_name
        FROM sys_user
        WHERE user_id IN
        <foreach collection="userIds" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>
     </delete>
        and del_flag = '0'
    </select>
    <select id="selectUserByNickName" resultType="com.ruoyi.project.system.domain.SysUser"
            parameterType="java.lang.String">
        <include refid="selectUserVo"/>
        where u.nick_name = #{nickName} and u.del_flag = '0'
        limit 1
    </select>
    <select id="getUserByRole" resultType="java.lang.Long">
        select distinct su.user_id
        from sys_user su
                 left join sys_user_role sur on su.user_id = sur.user_id
                 left join sys_role sr on sur.role_id = sr.role_id
        where role_name like concat('%', #{role}, '%')
          and sr.del_flag = '0'
          and sr.status = '0'
          and su.status = '0'
          and su.del_flag = '0'
    </select>
    <select id="getUserByPerms" resultType="java.lang.Long">
        select distinct t5.user_id
        from sys_role_menu t1
        left join sys_menu t2 on t1.menu_id = t2.menu_id
        left join sys_role t3 on t1.role_id = t3.role_id
        inner join sys_user_role t4 on t4.role_id = t3.role_id
        inner join sys_user t5 on t5.user_id = t4.user_id
        where t3.del_flag = '0'
        and t2.perms is not null
        and t2.perms &lt;&gt; ''
        and t5.del_flag = '0'
        and t5.status = '0'
        and t3.status = '0'
        <if test="perms != null and perms.size() > 0">
            AND (
            <foreach collection="perms" item="p" separator=" OR ">
                t2.perms = #{p}
                OR t2.perms = (split_part(#{p}, ':', 1) || ':' || split_part(#{p}, ':', 2) || ':*')
                OR t2.perms = (split_part(#{p}, ':', 1) || ':*:*')
            </foreach>
            OR t2.perms = '*:*:*'
            )
        </if>
    </select>
    <insert id="insertUser" parameterType="com.ruoyi.project.system.domain.SysUser" useGeneratedKeys="true"
            keyProperty="userId">
        insert into sys_user(
        <if test="userId != null and userId != 0">user_id,</if>
        <if test="userName != null and userName != ''">user_name,</if>
        <if test="nickName != null and nickName != ''">nick_name,</if>
        <if test="email != null and email != ''">email,</if>
        <if test="avatar != null and avatar != ''">avatar,</if>
        <if test="phonenumber != null and phonenumber != ''">phonenumber,</if>
        <if test="sex != null and sex != ''">sex,</if>
        <if test="password != null and password != ''">password,</if>
        <if test="status != null and status != ''">status,</if>
        <if test="createBy != null and createBy != ''">create_by,</if>
        <if test="remark != null and remark != ''">remark,</if>
        <if test="tenantId != null ">tenant_id,</if>
        create_time
        )values(
        <if test="userId != null and userId != ''">#{userId},</if>
        <if test="userName != null and userName != ''">#{userName},</if>
        <if test="nickName != null and nickName != ''">#{nickName},</if>
        <if test="email != null and email != ''">#{email},</if>
        <if test="avatar != null and avatar != ''">#{avatar},</if>
        <if test="phonenumber != null and phonenumber != ''">#{phonenumber},</if>
        <if test="sex != null and sex != ''">#{sex},</if>
        <if test="password != null and password != ''">#{password},</if>
        <if test="status != null and status != ''">#{status},</if>
        <if test="createBy != null and createBy != ''">#{createBy},</if>
        <if test="remark != null and remark != ''">#{remark},</if>
        <if test="tenantId != null ">#{tenantId},</if>
        sysdate()
        )
    </insert>
    <update id="updateUser" parameterType="com.ruoyi.project.system.domain.SysUser">
        update sys_user
        <set>
            <if test="nickName != null and nickName != ''">nick_name = #{nickName},</if>
            <if test="email != null ">email = #{email},</if>
            <if test="phonenumber != null ">phonenumber = #{phonenumber},</if>
            <if test="sex != null and sex != ''">sex = #{sex},</if>
            <if test="avatar != null and avatar != ''">avatar = #{avatar},</if>
            <if test="password != null and password != ''">password = #{password},</if>
            <if test="status != null and status != ''">status = #{status},</if>
            <if test="loginIp != null and loginIp != ''">login_ip = #{loginIp},</if>
            <if test="loginDate != null">login_date = #{loginDate},</if>
            <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
            <if test="remark != null">remark = #{remark},</if>
            <if test="tenantId != null">tenant_id = #{tenantId},</if>
            update_time = sysdate()
        </set>
        where user_id = #{userId}
    </update>
    <update id="updateUserStatus" parameterType="com.ruoyi.project.system.domain.SysUser">
        update sys_user
        set status = #{status}
        where user_id = #{userId}
    </update>
    <update id="updateUserAvatar" parameterType="com.ruoyi.project.system.domain.SysUser">
        update sys_user
        set avatar = #{avatar}
        where user_name = #{userName}
    </update>
    <update id="resetUserPwd" parameterType="com.ruoyi.project.system.domain.SysUser">
        update sys_user
        set password = #{password}
        where user_name = #{userName}
    </update>
    <delete id="deleteUserById" parameterType="Long">
        update sys_user
        set del_flag = '2'
        where user_id = #{userId}
    </delete>
    <delete id="deleteUserByIds" parameterType="Long">
        update sys_user set del_flag = '2' where user_id in
        <foreach collection="array" item="userId" open="(" separator="," close=")">
            #{userId}
        </foreach>
    </delete>
    <select id="getUserByRole" resultType="java.lang.Long">
        select distinct su.user_id
        from sys_user su
                 left join sys_user_role sur on su.user_id = sur.user_id
                 left join sys_role sr on sur.role_id = sr.role_id
        where role_name like concat('%', #{role}, '%')
          and sr.del_flag = '0'
          and sr.status = '0'
          and su.status = '0'
          and su.del_flag = '0'
    </select>
    <select id="getUserByPerms" resultType="java.lang.Long">
        select distinct t5.user_id
        from sys_role_menu t1
        left join sys_menu t2 on t1.menu_id = t2.menu_id
        left join sys_role t3 on t1.role_id = t3.role_id
        inner join sys_user_role t4 on t4.role_id = t3.role_id
        inner join sys_user t5 on t5.user_id = t4.user_id
        where t3.del_flag = '0'
        and t2.perms is not null
        and t2.perms &lt;&gt; ''
        and t5.del_flag = '0'
        and t5.status = '0'
        and t3.status = '0'
        <if test="perms != null and perms.size() > 0">
            AND (
            <foreach collection="perms" item="p" separator=" OR ">
                t2.perms = #{p}
                OR t2.perms = (split_part(#{p}, ':', 1) || ':' || split_part(#{p}, ':', 2) || ':*')
                OR t2.perms = (split_part(#{p}, ':', 1) || ':*:*')
            </foreach>
            OR t2.perms = '*:*:*'
            )
        </if>
    </select>
</mapper>
src/test/java/com/ruoyi/stock/service/impl/StockOutRecordBatchUpdateTest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,254 @@
package com.ruoyi.stock.service.impl;
import com.ruoyi.production.mapper.ProductionOrderMapper;
import com.ruoyi.production.mapper.ProductionOrderPickMapper;
import com.ruoyi.production.pojo.ProductionOrder;
import com.ruoyi.production.pojo.ProductionOrderPick;
import com.ruoyi.purchase.mapper.PurchaseReturnOrdersMapper;
import com.ruoyi.purchase.pojo.PurchaseReturnOrders;
import com.ruoyi.sales.mapper.SalesLedgerMapper;
import com.ruoyi.sales.mapper.ShippingInfoMapper;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.pojo.ShippingInfo;
import com.ruoyi.stock.mapper.StockOutRecordMapper;
import com.ruoyi.stock.pojo.StockOutRecord;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
@SpringBootTest
public class StockOutRecordBatchUpdateTest {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private StockOutRecordMapper stockOutRecordMapper;
    @Autowired
    private PurchaseReturnOrdersMapper purchaseReturnOrdersMapper;
    @Autowired
    private ShippingInfoMapper shippingInfoMapper;
    @Autowired
    private SalesLedgerMapper salesLedgerMapper;
    @Autowired
    private ProductionOrderPickMapper productionOrderPickMapper;
    @Autowired
    private ProductionOrderMapper productionOrderMapper;
    /**
     * æ›´æ–°å‡ºåº“单时间
     */
    @Test
    void testUpdateStockOutRecords() {
        List<StockOutRecord> allRecords = stockOutRecordMapper.selectList(null);
        System.out.println("总记录数: " + allRecords.size());
        List<RecordWithDate> recordWithDates = new ArrayList<>();
        for (StockOutRecord record : allRecords) {
            String type = record.getRecordType();
            if (type == null) continue;
            switch (type) {
                case "1":
                case "10":
                    recordWithDates.add(resolveType1or10(record, type));
                    break;
                case "3":
                    System.out.println("类型3(生产报工-出库)预留分支,当前无数据,跳过");
                    break;
                case "8":
                    System.out.println("类型8(销售-出库)预留分支,当前无数据,跳过");
                    break;
                case "9":
                    recordWithDates.add(resolveType9(record));
                    break;
                case "13":
                    recordWithDates.add(resolveType13(record));
                    break;
                case "14":
                    recordWithDates.add(resolveType14or15(record));
                    break;
                case "15":
                    recordWithDates.add(resolveType14or15(record));
                    break;
                default:
                    System.out.println("未知类型 " + type + ",跳过 ID=" + record.getId());
            }
        }
        Map<LocalDate, List<RecordWithDate>> byDate = recordWithDates.stream()
                .collect(Collectors.groupingBy(
                        rwd -> rwd.dateTime.toLocalDate(),
                        LinkedHashMap::new,
                        Collectors.toList()
                ));
        int totalUpdated = 0;
        for (Map.Entry<LocalDate, List<RecordWithDate>> dateEntry : byDate.entrySet()) {
            LocalDate date = dateEntry.getKey();
            List<RecordWithDate> records = dateEntry.getValue();
            records.sort(Comparator.comparing(rwd -> rwd.dateTime));
            assignRandomTimes(records, date);
            records.sort(Comparator.comparing(rwd -> rwd.dateTime));
            int seq = 1;
            for (RecordWithDate rwd : records) {
                StockOutRecord record = rwd.record;
                String type = record.getRecordType();
                String batchNo = "CK" + date.format(DateTimeFormatter.ofPattern("yyyyMMdd")) + String.format("%03d", seq++);
                LocalDateTime createTime = rwd.dateTime;
                jdbcTemplate.update(
                        "UPDATE stock_out_record SET outbound_batches = ?, create_time = ?, update_time = ? WHERE id = ?",
                        batchNo, createTime, createTime, record.getId());
                System.out.println("ID=" + record.getId()
                        + " type=" + type
                        + " batch=" + batchNo
                        + " time=" + createTime);
                totalUpdated++;
            }
        }
        System.out.println("全部完成!共更新 " + totalUpdated + " æ¡è®°å½•");
    }
    private void assignRandomTimes(List<RecordWithDate> records, LocalDate date) {
        List<RecordWithDate> individual = new ArrayList<>();
        Map<Long, List<RecordWithDate>> grouped = new LinkedHashMap<>();
        for (RecordWithDate rwd : records) {
            String type = rwd.record.getRecordType();
            if (!"1".equals(type) && !"9".equals(type) && !"10".equals(type)
                    && !"13".equals(type) && !"14".equals(type) && !"15".equals(type)) {
                continue;
            }
            if (("14".equals(type) || "15".equals(type)) && rwd.record.getRecordId() != null) {
                grouped.computeIfAbsent(rwd.record.getRecordId(), k -> new ArrayList<>()).add(rwd);
            } else {
                individual.add(rwd);
            }
        }
        List<TimeSlot> slots = new ArrayList<>();
        for (RecordWithDate rwd : individual) {
            slots.add(new TimeSlot(rwd.record.getId(), List.of(rwd)));
        }
        for (Map.Entry<Long, List<RecordWithDate>> entry : grouped.entrySet()) {
            long minId = entry.getValue().stream()
                    .mapToLong(rwd -> rwd.record.getId())
                    .min().orElse(0);
            slots.add(new TimeSlot(minId, entry.getValue()));
        }
        if (slots.isEmpty()) return;
        slots.sort(Comparator.comparingLong(s -> s.sortKey));
        int totalMinutes = 480;
        for (int i = 0; i < slots.size(); i++) {
            int offsetMinutes = (int) ((long) i * totalMinutes / slots.size());
            int jitter = (int) (Math.random() * 6 - 3);
            offsetMinutes = Math.max(0, Math.min(479, offsetMinutes + jitter));
            LocalTime time;
            if (offsetMinutes < 240) {
                time = LocalTime.of(8, 0).plusMinutes(offsetMinutes);
            } else {
                time = LocalTime.of(14, 0).plusMinutes(offsetMinutes - 240);
            }
            LocalDateTime dt = LocalDateTime.of(date, time);
            for (RecordWithDate rwd : slots.get(i).members) {
                rwd.dateTime = dt;
            }
        }
    }
    private static class TimeSlot {
        final long sortKey;
        final List<RecordWithDate> members;
        TimeSlot(long sortKey, List<RecordWithDate> members) {
            this.sortKey = sortKey;
            this.members = members;
        }
    }
    private RecordWithDate resolveType1or10(StockOutRecord record, String type) {
        LocalDate date = record.getCreateTime() != null
                ? record.getCreateTime().toLocalDate()
                : LocalDate.now();
        return new RecordWithDate(record, LocalDateTime.of(date, LocalTime.of(8, 0)));
    }
    private RecordWithDate resolveType9(StockOutRecord record) {
        Long recordId = record.getRecordId();
        if (recordId != null) {
            PurchaseReturnOrders pro = purchaseReturnOrdersMapper.selectById(recordId);
            if (pro != null && pro.getPreparedAt() != null) {
                return new RecordWithDate(record, LocalDateTime.of(pro.getPreparedAt(), LocalTime.of(8, 0)));
            }
        }
        return fallbackDateTime(record);
    }
    private RecordWithDate resolveType13(StockOutRecord record) {
        Long recordId = record.getRecordId();
        if (recordId != null) {
            ShippingInfo shippingInfo = shippingInfoMapper.selectById(recordId);
            if (shippingInfo != null && shippingInfo.getSalesLedgerId() != null) {
                SalesLedger salesLedger = salesLedgerMapper.selectById(shippingInfo.getSalesLedgerId());
                if (salesLedger != null && salesLedger.getDeliveryDate() != null) {
                    return new RecordWithDate(record, LocalDateTime.of(salesLedger.getDeliveryDate(), LocalTime.of(8, 0)));
                }
            }
        }
        return fallbackDateTime(record);
    }
    private RecordWithDate resolveType14or15(StockOutRecord record) {
        Long recordId = record.getRecordId();
        if (recordId != null) {
            ProductionOrderPick pick = productionOrderPickMapper.selectById(recordId);
            if (pick != null && pick.getProductionOrderId() != null) {
                ProductionOrder order = productionOrderMapper.selectById(pick.getProductionOrderId());
                if (order != null && order.getStartTime() != null) {
                    return new RecordWithDate(record, LocalDateTime.of(order.getStartTime().toLocalDate(), LocalTime.of(8, 0)));
                }
            }
        }
        return fallbackDateTime(record);
    }
    private RecordWithDate fallbackDateTime(StockOutRecord record) {
        return record.getCreateTime() != null
                ? new RecordWithDate(record, record.getCreateTime())
                : new RecordWithDate(record, LocalDateTime.now());
    }
    private static class RecordWithDate {
        final StockOutRecord record;
        LocalDateTime dateTime;
        RecordWithDate(StockOutRecord record, LocalDateTime dateTime) {
            this.record = record;
            this.dateTime = dateTime;
        }
    }
}