| | |
| | | import com.ruoyi.stock.dto.StockUninventoryDto; |
| | | import com.ruoyi.stock.execl.StockInventoryExportData; |
| | | import com.ruoyi.stock.mapper.StockInventoryMapper; |
| | | import com.ruoyi.stock.mapper.WarehouseInfoMapper; |
| | | import com.ruoyi.stock.pojo.StockInRecord; |
| | | import com.ruoyi.stock.pojo.StockInventory; |
| | | import com.ruoyi.stock.pojo.WarehouseInfo; |
| | | import com.ruoyi.stock.service.StockInRecordService; |
| | | import com.ruoyi.stock.service.StockInventoryService; |
| | | import com.ruoyi.stock.service.StockOutRecordService; |
| | | import com.ruoyi.stock.service.StockUninventoryService; |
| | | import com.ruoyi.warehouse.service.impl.WarehouseServiceImpl; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import lombok.AllArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | @AllArgsConstructor |
| | | public class StockInventoryServiceImpl extends ServiceImpl<StockInventoryMapper, StockInventory> implements StockInventoryService { |
| | | |
| | | private final WarehouseServiceImpl warehouseServiceImpl; |
| | | private final WarehouseInfoMapper warehouseInfoMapper; |
| | | private StockInventoryMapper stockInventoryMapper; |
| | | private StockInRecordService stockInRecordService; |
| | | private StockOutRecordService stockOutRecordService; |
| | |
| | | //入库调用 |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Boolean addstockInventory(StockInventoryDto stockInventoryDto) { |
| | | public StockInRecordDto addstockInventory(StockInventoryDto stockInventoryDto) { |
| | | Long warehouseInfoId = requireWarehouseInfoId(stockInventoryDto.getWarehouseInfoId()); |
| | | String batchNo = StringUtils.trim(stockInventoryDto.getBatchNo()); |
| | | if (StringUtils.isEmpty(batchNo)) { |
| | | batchNo = generateAutoBatchNo(stockInventoryDto.getProductModelId()); |
| | | } |
| | | stockInventoryDto.setBatchNo(batchNo); |
| | | |
| | | LambdaQueryWrapper<StockInventory> eq = new QueryWrapper<StockInventory>().lambda() |
| | | .eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId()); |
| | | eq.eq(StockInventory::getBatchNo, stockInventoryDto.getBatchNo()); |
| | | LambdaQueryWrapper<StockInventory> eq = buildQualifiedInventoryQuery( |
| | | stockInventoryDto.getProductModelId(), |
| | | stockInventoryDto.getBatchNo(), |
| | | stockInventoryDto.getWarehouseInfoId() |
| | | ); |
| | | //新增入库记录再添加库存 |
| | | StockInRecordDto stockInRecordDto = new StockInRecordDto(); |
| | | stockInRecordDto.setRecordId(stockInventoryDto.getRecordId()); |
| | |
| | | stockInRecordDto.setBatchNo(stockInventoryDto.getBatchNo()); |
| | | stockInRecordDto.setProductModelId(stockInventoryDto.getProductModelId()); |
| | | stockInRecordDto.setType("0"); |
| | | stockInRecordDto.setWarehouseInfoId(warehouseInfoId); |
| | | stockInRecordService.add(stockInRecordDto); |
| | | //再进行新增库存数量库存 |
| | | //先查询库存表中的产品是否存在,不存在新增,存在更新 |
| | |
| | | newStockInventory.setRemark(stockInventoryDto.getRemark()); |
| | | newStockInventory.setBatchNo(stockInventoryDto.getBatchNo()); |
| | | newStockInventory.setLockedQuantity(stockInventoryDto.getLockedQuantity()); |
| | | newStockInventory.setWarehouseInfoId(stockInventoryDto.getWarehouseInfoId()); |
| | | newStockInventory.setWarnNum(stockInventoryDto.getWarnNum()); |
| | | stockInventoryMapper.insert(newStockInventory); |
| | | }else { |
| | | stockInventoryMapper.updateAddStockInventory(stockInventoryDto); |
| | | } |
| | | return true; |
| | | return stockInRecordDto; |
| | | } |
| | | |
| | | //出库调用 |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Boolean subtractStockInventory(StockInventoryDto stockInventoryDto) { |
| | | LambdaQueryWrapper<StockInventory> eq = new QueryWrapper<StockInventory>().lambda() |
| | | .eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId()); |
| | | public StockOutRecordDto subtractStockInventory(StockInventoryDto stockInventoryDto) { |
| | | Long warehouseInfoId = requireWarehouseInfoId(stockInventoryDto.getWarehouseInfoId()); |
| | | if (StringUtils.isEmpty(stockInventoryDto.getBatchNo())) { |
| | | eq.isNull(StockInventory::getBatchNo); |
| | | stockInventoryDto.setBatchNo(null); |
| | | } else { |
| | | eq.eq(StockInventory::getBatchNo, stockInventoryDto.getBatchNo()); |
| | | } |
| | | LambdaQueryWrapper<StockInventory> eq = buildQualifiedInventoryQuery( |
| | | stockInventoryDto.getProductModelId(), |
| | | stockInventoryDto.getBatchNo(), |
| | | stockInventoryDto.getWarehouseInfoId() |
| | | ); |
| | | // 新增出库记录 |
| | | StockOutRecordDto stockOutRecordDto = new StockOutRecordDto(); |
| | | stockOutRecordDto.setRecordId(stockInventoryDto.getRecordId()); |
| | | stockOutRecordDto.setRecordType(stockInventoryDto.getRecordType()); |
| | | stockOutRecordDto.setStockOutNum(stockInventoryDto.getQualitity()); |
| | | stockOutRecordDto.setBatchNo(stockInventoryDto.getBatchNo()); |
| | | stockOutRecordDto.setApprovalStatus(0); |
| | | stockOutRecordDto.setProductModelId(stockInventoryDto.getProductModelId()); |
| | | stockOutRecordDto.setType("0"); |
| | | stockOutRecordService.add(stockOutRecordDto); |
| | | stockOutRecordDto.setWarehouseInfoId(warehouseInfoId); |
| | | Long id = stockOutRecordService.add(stockOutRecordDto); |
| | | stockInventoryDto.setId(id); |
| | | |
| | | |
| | | StockInventory oldStockInventory = stockInventoryMapper.selectOne(eq); |
| | |
| | | } |
| | | |
| | | stockInventoryMapper.updateSubtractStockInventory(stockInventoryDto); |
| | | return true; |
| | | return stockOutRecordDto; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Boolean addStockInRecordOnly(StockInventoryDto stockInventoryDto) { |
| | | public StockInRecordDto addStockInRecordOnly(StockInventoryDto stockInventoryDto) { |
| | | Long warehouseInfoId = requireWarehouseInfoId(stockInventoryDto.getWarehouseInfoId()); |
| | | String batchNo = StringUtils.trim(stockInventoryDto.getBatchNo()); |
| | | if (StringUtils.isEmpty(batchNo)) { |
| | | batchNo = generateAutoBatchNo(stockInventoryDto.getProductModelId()); |
| | |
| | | stockInRecordDto.setRecordType(stockInventoryDto.getRecordType()); |
| | | stockInRecordDto.setStockInNum(stockInventoryDto.getQualitity()); |
| | | stockInRecordDto.setBatchNo(batchNo); |
| | | stockInRecordDto.setApprovalStatus(0); |
| | | stockInRecordDto.setProductModelId(stockInventoryDto.getProductModelId()); |
| | | stockInRecordDto.setType("0"); |
| | | stockInRecordDto.setWarehouseInfoId(warehouseInfoId); |
| | | stockInRecordDto.setRemark(stockInventoryDto.getRemark()); |
| | | stockInRecordService.add(stockInRecordDto); |
| | | return true; |
| | | Long add = stockInRecordService.add(stockInRecordDto); |
| | | stockInRecordDto.setId( add); |
| | | return stockInRecordDto; |
| | | } |
| | | |
| | | //规则生成:20260424-产品编号-001 |
| | |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Boolean addStockOutRecordOnly(StockInventoryDto stockInventoryDto) { |
| | | LambdaQueryWrapper<StockInventory> eq = new LambdaQueryWrapper<>(); |
| | | eq.eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId()); |
| | | public StockOutRecordDto addStockOutRecordOnly(StockInventoryDto stockInventoryDto) { |
| | | if (StringUtils.isEmpty(stockInventoryDto.getBatchNo())) { |
| | | eq.isNull(StockInventory::getBatchNo); |
| | | } else { |
| | | eq.eq(StockInventory::getBatchNo, stockInventoryDto.getBatchNo()); |
| | | stockInventoryDto.setBatchNo(null); |
| | | } |
| | | Long warehouseInfoId = requireWarehouseInfoId(stockInventoryDto.getWarehouseInfoId()); |
| | | LambdaQueryWrapper<StockInventory> eq = buildQualifiedInventoryQuery( |
| | | stockInventoryDto.getProductModelId(), |
| | | stockInventoryDto.getBatchNo(), |
| | | warehouseInfoId |
| | | ); |
| | | StockInventory stockInventory = stockInventoryMapper.selectOne(eq); |
| | | if (stockInventory == null) { |
| | | throw new ServiceException("库存记录不存在"); |
| | |
| | | BigDecimal pendingOut = stockInventoryMapper.selectPendingOutQuantity( |
| | | stockInventoryDto.getProductModelId(), |
| | | stockInventoryDto.getBatchNo(), |
| | | warehouseInfoId, |
| | | "0" |
| | | ); |
| | | if (pendingOut == null) { |
| | |
| | | stockOutRecordDto.setBatchNo(stockInventoryDto.getBatchNo()); |
| | | stockOutRecordDto.setProductModelId(stockInventoryDto.getProductModelId()); |
| | | stockOutRecordDto.setType("0"); |
| | | stockOutRecordDto.setWarehouseInfoId(warehouseInfoId); |
| | | stockOutRecordDto.setRemark(stockInventoryDto.getRemark()); |
| | | stockOutRecordService.add(stockOutRecordDto); |
| | | return true; |
| | | Long add = stockOutRecordService.add(stockOutRecordDto); |
| | | stockInventoryDto.setId(add); |
| | | return stockOutRecordDto; |
| | | } |
| | | |
| | | private Long requireWarehouseInfoId(Long warehouseInfoId) { |
| | | if (warehouseInfoId == null) { |
| | | // throw new ServiceException("仓库不能为空"); |
| | | warehouseInfoId = 1L; |
| | | } |
| | | return warehouseInfoId; |
| | | } |
| | | |
| | | private LambdaQueryWrapper<StockInventory> buildQualifiedInventoryQuery(Long productModelId, String batchNo, Long warehouseInfoId) { |
| | | LambdaQueryWrapper<StockInventory> wrapper = new QueryWrapper<StockInventory>().lambda() |
| | | .eq(StockInventory::getProductModelId, productModelId); |
| | | if (warehouseInfoId == null) { |
| | | wrapper.isNull(StockInventory::getWarehouseInfoId); |
| | | } else { |
| | | wrapper.eq(StockInventory::getWarehouseInfoId, warehouseInfoId); |
| | | } |
| | | if (StringUtils.isEmpty(batchNo)) { |
| | | wrapper.isNull(StockInventory::getBatchNo); |
| | | } else { |
| | | wrapper.eq(StockInventory::getBatchNo, batchNo); |
| | | } |
| | | return wrapper; |
| | | } |
| | | |
| | | @Override |
| | |
| | | try { |
| | | // 查询所有的产品并构建映射,提高查找效率 |
| | | List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectProduct(); |
| | | List<WarehouseInfo> warehouseInfos = warehouseInfoMapper.selectList(null); |
| | | Map<String, SalesLedgerProduct> productMap = new HashMap<>(); |
| | | for (SalesLedgerProduct product : salesLedgerProducts) { |
| | | // 使用产品类别和规格型号作为键 |
| | |
| | | stockInventoryDto.setQualitity(dto.getQualifiedQuantity()); |
| | | stockInventoryDto.setRemark(dto.getRemark()); |
| | | stockInventoryDto.setWarnNum(dto.getWarnNum()); |
| | | stockInventoryDto.setBatchNo(dto.getBatchNo()); |
| | | stockInventoryDto.setWarehouseName(dto.getWarehouseName()); |
| | | Long warehouseInfoId = warehouseInfos.stream() |
| | | .filter(warehouseInfo -> dto.getWarehouseName().equals(warehouseInfo.getWarehouseName())) |
| | | .map(WarehouseInfo::getId) |
| | | .findFirst() |
| | | .orElseThrow(() -> new RuntimeException("系统未找到仓库:" + dto.getWarehouseName())); |
| | | stockInventoryDto.setWarehouseInfoId(warehouseInfoId); |
| | | |
| | | // 验证合格冻结数量 |
| | | if (ObjectUtils.isNotEmpty(dto.getQualifiedLockedQuantity())) { |
| | |
| | | stockUninventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_IN.getCode()); |
| | | stockUninventoryDto.setQualitity(dto.getUnQualifiedQuantity()); |
| | | stockUninventoryDto.setRemark(dto.getRemark()); |
| | | stockUninventoryDto.setBatchNo(dto.getBatchNo()); |
| | | stockUninventoryDto.setWarehouseName(dto.getWarehouseName()); |
| | | |
| | | // 验证不合格冻结数量 |
| | | if (ObjectUtils.isNotEmpty(dto.getUnQualifiedLockedQuantity())) { |
| | |
| | | public List<StockInventory> getByModelId(Long modelId) { |
| | | return stockInventoryMapper.getByModelId(modelId); |
| | | } |
| | | |
| | | @Override |
| | | public List<StockInventoryDto> selectStockInvenrory(Long productModelId) { |
| | | return stockInventoryMapper.selectStockInvenrory(productModelId); |
| | | } |
| | | |
| | | @Override |
| | | public IPage<StockInventoryDto> pagestockInventoryNoQua(Page page, StockInventoryDto stockInventoryDto) { |
| | | return stockInventoryMapper.pagestockInventoryNoQua(page, stockInventoryDto); |
| | | } |
| | | |
| | | @Override |
| | | public boolean updateLocked(Long productModelId, String batchNo, boolean b) { |
| | | return stockInventoryMapper.updateLocked(productModelId, batchNo, b) > 0; |
| | | } |
| | | } |