liyong
2026-05-15 0578c6c76f13e367b5dc7d0882efe3c69ca4cb0e
src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckPlanServiceImpl.java
@@ -7,6 +7,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.utils.OrderUtils;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.procurementrecord.utils.StockUtils;
@@ -16,16 +17,16 @@
import com.ruoyi.stock.mapper.StockInventoryCheckItemMapper;
import com.ruoyi.stock.mapper.StockInventoryCheckPlanMapper;
import com.ruoyi.stock.mapper.StockInventoryCheckProductMapper;
import com.ruoyi.stock.mapper.WarehouseInfoMapper;
import com.ruoyi.stock.pojo.*;
import com.ruoyi.stock.service.*;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
/**
 * <p>
@@ -48,6 +49,7 @@
    private final StockUtils stockUtils;
    private final StockInRecordService stockInRecordService;
    private final StockOutRecordService stockOutRecordService;
    private final WarehouseInfoMapper warehouseInfoMapper;
    @Override
    public IPage<StockInventoryCheckPlanDto> listPage(Page page, StockInventoryCheckPlanDto stockInventoryCheckPlanDto) {
@@ -60,6 +62,7 @@
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R start(Long id) {
        StockInventoryCheckPlan stockInventoryCheckPlan = this.getById(id);
        StockInventoryCheckPlanDto stockInventoryCheckPlanDto = new StockInventoryCheckPlanDto();
@@ -98,6 +101,7 @@
                StockInventoryCheckItemDto stockInventoryCheckItemDto = new StockInventoryCheckItemDto();
                stockInventoryCheckItemDto.setProductModelId(stockInventory.getProductModelId());
                stockInventoryCheckItemDto.setBatchNo(stockInventory.getBatchNo());
                stockInventoryCheckItemDto.setWarehouseInfoId(stockInventory.getWarehouseInfoId());
                stockInventoryCheckItemDto.setSystemQuantity(stockInventory.getQualitity());
                stockInventoryCheckItemDto.setModel(stockInventory.getModel());
                stockInventoryCheckItemDto.setUnit(stockInventory.getUnit());
@@ -119,6 +123,8 @@
            return R.fail("盘点单不存在");
        }
        for (StockInventoryCheckItem item : stockInventoryCheckPlanDto.getCheckItems()) {
            //更新库存锁定状态
            stockInventoryService.updateLocked(item.getProductModelId(),item.getBatchNo(), false);
            if (item.getDifferenceQuantity() == null || item.getDifferenceQuantity().compareTo(BigDecimal.ZERO) == 0) {
                continue;
            }
@@ -129,16 +135,15 @@
            stockInventoryDto.setRecordId(stockInventoryCheckPlanDto.getId());
            if (item.getDifferenceQuantity().compareTo(BigDecimal.ZERO) > 0) {
                stockInventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.INVENTORY_CHECK_STOCK_OUT.getCode());
                StockInRecordDto stockInRecordDto = stockUtils.addStockWithBatchNo(stockInventoryDto.getProductModelId(), stockInventoryDto.getQualitity(), stockInventoryDto.getRecordType(), stockInventoryDto.getRecordId(), stockInventoryDto.getBatchNo());
                //直接审核通过
                stockInRecordService.batchApprove(Collections.singletonList(stockInRecordDto.getId()), 1);
            }else {
                stockInventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.INVENTORY_CHECK_STOCK_IN.getCode());
                StockOutRecordDto stockOutRecordDto = stockUtils.substractStock(stockInventoryDto.getProductModelId(), stockInventoryDto.getQualitity(), stockInventoryDto.getRecordType(), stockInventoryDto.getRecordId(), stockInventoryDto.getBatchNo());
                StockInRecordDto stockInRecordDto = stockUtils.addStockWithBatchNo(stockInventoryDto.getProductModelId(), item.getDifferenceQuantity().abs (), stockInventoryDto.getRecordType(), stockInventoryDto.getRecordId(), stockInventoryDto.getBatchNo(), resolveWarehouseInfoId(item.getProductModelId(), item.getBatchNo()));
                //直接审核通过
                stockOutRecordService.batchApprove(Collections.singletonList(stockOutRecordDto.getId()), 1);
                stockInRecordService.batchApprove(Collections.singletonList(stockInRecordDto.getId()), 1, resolveWarehouseInfoId(item.getProductModelId(), item.getBatchNo()));
            }else {
                stockInventoryDto.setRecordType(StockOutQualifiedRecordTypeEnum.INVENTORY_CHECK_STOCK_OUT.getCode());
                StockOutRecordDto stock = stockUtils.substractStock(stockInventoryDto.getProductModelId(), item.getDifferenceQuantity().abs(), stockInventoryDto.getRecordType(), stockInventoryDto.getRecordId(), stockInventoryDto.getBatchNo(), resolveWarehouseInfoId(item.getProductModelId(), item.getBatchNo()));
                //直接审核通过
                stockOutRecordService.batchApprove(Collections.singletonList(stock.getId()), 1,item.getWarehouseInfoId());
            }
        }
        stockInventoryCheckItemMapper.updateById(stockInventoryCheckPlanDto.getCheckItems());
@@ -149,6 +154,9 @@
    @Override
    public StockInventoryCheckPlanDto detail(Long id) {
        //查询仓库
        List<WarehouseInfo> warehouseInfos = warehouseInfoMapper.selectList(null);
        StockInventoryCheckPlan byId = this.getById(id);
        if (byId == null) {
            return null;
@@ -169,6 +177,9 @@
            List<StockInventoryCheckItem> checkItems = stockInventoryCheckItemMapper.selectList(
                    new LambdaQueryWrapper<StockInventoryCheckItem>()
                            .eq(StockInventoryCheckItem::getMainId, checkMain.getId()));
            checkItems.stream().forEach(item -> {
                item.setWarehouseName(warehouseInfos.stream().filter(warehouseInfo -> warehouseInfo.getId().equals(item.getWarehouseInfoId())).findFirst().get().getWarehouseName());
            });
            stockInventoryCheckPlanDto.setCheckItems(checkItems);
        }
@@ -205,19 +216,41 @@
    public R edit(StockInventoryCheckPlanDto stockInventoryCheckPlanDto) {
        SysUser sysUser = sysUserMapper.selectUserById(stockInventoryCheckPlanDto.getCheckerId());
        stockInventoryCheckPlanDto.setCheckerName(sysUser.getNickName());
        //赋值
        //设置盘点商品关联ID并查询系统库存
        // 查询数据库中的旧数据
        List<StockInventoryCheckProduct> oldItems = stockInventoryCheckProductMapper.selectList(
                new LambdaQueryWrapper<StockInventoryCheckProduct>()
                        .eq(StockInventoryCheckProduct::getInventoryCheckPlanId, stockInventoryCheckPlanDto.getId()));
        // 设置盘点商品关联 ID 并查询系统库存
        stockInventoryCheckPlanDto.getItems().forEach(item -> {
            item.setInventoryCheckPlanId(stockInventoryCheckPlanDto.getId());
            List<StockInventory> list = stockInventoryService.list(new LambdaQueryWrapper<StockInventory>().eq(StockInventory::getProductModelId, item.getProductModelId()));
            // 查询并设置系统库存
            List<StockInventory> list = stockInventoryService.list(
                    new LambdaQueryWrapper<StockInventory>().eq(StockInventory::getProductModelId, item.getProductModelId()));
            BigDecimal systemQty = list.stream()
                    .map(StockInventory::getQualitity)
                    .filter(Objects::nonNull)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            item.setSystemQuantity(systemQty);
            // 如果旧数据中不存在该 ID,说明是新增,需要清空 ID 让数据库自动生成
            boolean isExisting = oldItems.stream().anyMatch(old -> old.getId().equals(item.getId()));
            if (!isExisting) {
                item.setId(null);
            }
        });
        //更新或新增
        // 使用 insertOrUpdate 批量处理,自动区分新增和更新
        stockInventoryCheckProductMapper.insertOrUpdate(stockInventoryCheckPlanDto.getItems());
        // 处理删除:旧数据中有但新数据中没有的项
        Set<Long> newItemIds = stockInventoryCheckPlanDto.getItems().stream()
                .map(StockInventoryCheckProduct::getId)
                .filter(Objects::nonNull)
                .collect(Collectors.toSet());
        List<Long> toDeleteIds = oldItems.stream()
                .map(StockInventoryCheckProduct::getId)
                .filter(id -> !newItemIds.contains(id))
                .collect(Collectors.toList());
        if (!toDeleteIds.isEmpty()) {
            stockInventoryCheckProductMapper.deleteByIds(toDeleteIds);
        }
        return R.ok(this.updateById(stockInventoryCheckPlanDto));
    }
@@ -232,4 +265,14 @@
    }
    private Long resolveWarehouseInfoId(Long productModelId, String batchNo) {
        List<StockInventory> inventories = stockInventoryService.list(new LambdaQueryWrapper<StockInventory>()
                .eq(StockInventory::getProductModelId, productModelId)
                .eq(batchNo != null, StockInventory::getBatchNo, batchNo)
                .isNull(batchNo == null, StockInventory::getBatchNo));
        if (inventories.isEmpty() || inventories.get(0).getWarehouseInfoId() == null) {
            return 1L;
        }
        return inventories.get(0).getWarehouseInfoId();
    }
}