From bd13c94f5f94cfcfbacee1b8d55976fb391ec4aa Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Fri, 25 Jul 2025 18:17:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=AB=E7=A0=81=E6=9E=AA=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E5=85=A5=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../klp/controller/WmsStockIoController.java | 21 ++++++- .../com/klp/service/IWmsStockIoService.java | 4 ++ .../service/impl/WmsStockIoServiceImpl.java | 61 ++++++++++++------- 3 files changed, 63 insertions(+), 23 deletions(-) diff --git a/klp-wms/src/main/java/com/klp/controller/WmsStockIoController.java b/klp-wms/src/main/java/com/klp/controller/WmsStockIoController.java index 4a87fb5a..4f016506 100644 --- a/klp-wms/src/main/java/com/klp/controller/WmsStockIoController.java +++ b/klp-wms/src/main/java/com/klp/controller/WmsStockIoController.java @@ -2,12 +2,17 @@ package com.klp.controller; import java.util.List; import java.util.Arrays; +import java.util.Map; +import com.klp.domain.WmsStockIo; +import com.klp.domain.WmsStockIoDetail; +import com.klp.domain.bo.WmsStockIoDetailBo; import com.klp.domain.vo.WmsStockIoDetailVo; import lombok.RequiredArgsConstructor; import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.*; import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; import com.klp.common.annotation.RepeatSubmit; @@ -146,5 +151,19 @@ public class WmsStockIoController extends BaseController { @RequestParam Integer status) { return toAjax(iWmsStockIoService.updateStatus(stockIoId, status)); } - + /** + * 扫码枪专用:根据明细ID直接入库,无需审核整单 + */ + @PostMapping("/scanInStock") + /** + * 扫码枪专用:根据传入明细参数直接入库,无需审核整单 + */ + public R scanInStock(@RequestBody WmsStockIoDetailBo bo) { + try { + boolean result = iWmsStockIoService.scanInStockByBo(bo); + return toAjax(result); + } catch (Exception e) { + return R.fail(e.getMessage()); + } + } } diff --git a/klp-wms/src/main/java/com/klp/service/IWmsStockIoService.java b/klp-wms/src/main/java/com/klp/service/IWmsStockIoService.java index bfb21a22..d95998c0 100644 --- a/klp-wms/src/main/java/com/klp/service/IWmsStockIoService.java +++ b/klp-wms/src/main/java/com/klp/service/IWmsStockIoService.java @@ -1,6 +1,7 @@ package com.klp.service; import com.klp.domain.WmsStockIo; +import com.klp.domain.bo.WmsStockIoDetailBo; import com.klp.domain.vo.WmsStockIoDetailVo; import com.klp.domain.vo.WmsStockIoVo; import com.klp.domain.bo.WmsStockIoBo; @@ -73,4 +74,7 @@ public interface IWmsStockIoService { * 批量新增主表和明细 */ void addWithDetail(WmsStockIoWithDetailBo bo); + + + boolean scanInStockByBo(WmsStockIoDetailBo bo); } diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsStockIoServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsStockIoServiceImpl.java index 9143b446..aaac8ccd 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsStockIoServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsStockIoServiceImpl.java @@ -1,26 +1,21 @@ package com.klp.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.klp.common.annotation.RepeatSubmit; import com.klp.common.core.page.TableDataInfo; import com.klp.common.core.domain.PageQuery; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.klp.common.utils.StringUtils; +import com.klp.domain.*; import com.klp.domain.vo.WmsStockIoDetailVo; +import com.klp.mapper.*; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import com.klp.domain.bo.WmsStockIoBo; import com.klp.domain.vo.WmsStockIoVo; -import com.klp.domain.WmsStockIo; -import com.klp.mapper.WmsStockIoMapper; import com.klp.service.IWmsStockIoService; -import com.klp.domain.WmsStockIoDetail; -import com.klp.domain.WmsStock; -import com.klp.mapper.WmsStockIoDetailMapper; -import com.klp.mapper.WmsStockMapper; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; @@ -45,6 +40,8 @@ public class WmsStockIoServiceImpl implements IWmsStockIoService { private final WmsStockIoMapper baseMapper; private final WmsStockIoDetailMapper stockIoDetailMapper; private final WmsStockMapper stockMapper; + private final WmsProductMapper productMapper; + private final WmsRawMaterialMapper rawMaterialMapper; /** * 查询出入库单主 @@ -144,6 +141,29 @@ public class WmsStockIoServiceImpl implements IWmsStockIoService { } } + @Override + @Transactional(rollbackFor = Exception.class) + public boolean scanInStockByBo(WmsStockIoDetailBo bo) { + String unit = bo.getUnit(); + // 如果unit为空,自动查item表补全 + if (unit == null || unit.trim().isEmpty()) { + if ("product".equals(bo.getItemType())) { + WmsProduct p = productMapper.selectById(bo.getItemId()); + unit = p != null ? p.getUnit() : null; + } else if ("raw_material".equals(bo.getItemType())) { + WmsRawMaterial r = rawMaterialMapper.selectById(bo.getItemId()); + unit = r != null ? r.getUnit() : null; + } + } + if (unit == null || unit.trim().isEmpty()) { + throw new RuntimeException("未能获取到单位"); + } + // 入库操作 + changeStock(bo.getWarehouseId(), bo.getItemType(), bo.getItemId(), bo.getQuantity(), true, unit); + return true; + } + + /** * 审核出入库/移库单,变更库存,含库存校验 */ @@ -162,26 +182,22 @@ public class WmsStockIoServiceImpl implements IWmsStockIoService { throw new RuntimeException("单据明细不能为空"); } for (WmsStockIoDetail detail : details) { - // 新增:扫码枪录入(recordType==1)时不做任何库存操作 - if (detail.getRecordType() != null && detail.getRecordType() == 1) { - continue; - } String ioType = stockIo.getIoType(); if ("in".equals(ioType)) { // 入库:目标库位库存增加 - changeStock(detail.getWarehouseId(), detail.getItemType(), detail.getItemId(), detail.getBatchNo(), detail.getQuantity(), true, detail.getUnit()); + changeStock(detail.getWarehouseId(), detail.getItemType(), detail.getItemId(), detail.getQuantity(), true, detail.getUnit()); } else if ("out".equals(ioType)) { // 出库:目标库位库存减少 - changeStock(detail.getWarehouseId(), detail.getItemType(), detail.getItemId(), detail.getBatchNo(), detail.getQuantity(), false, detail.getUnit()); + changeStock(detail.getWarehouseId(), detail.getItemType(), detail.getItemId(), detail.getQuantity(), false, detail.getUnit()); } else if ("transfer".equals(ioType)) { // 移库:fromWarehouseId减少,warehouseId增加 if (detail.getFromWarehouseId() == null) { throw new RuntimeException("移库明细缺少源库位ID"); } // 先减少源库位 - changeStock(detail.getFromWarehouseId(), detail.getItemType(), detail.getItemId(), detail.getBatchNo(), detail.getQuantity(), false, detail.getUnit()); + changeStock(detail.getFromWarehouseId(), detail.getItemType(), detail.getItemId(), detail.getQuantity(), false, detail.getUnit()); // 再增加目标库位 - changeStock(detail.getWarehouseId(), detail.getItemType(), detail.getItemId(), detail.getBatchNo(), detail.getQuantity(), true, detail.getUnit()); + changeStock(detail.getWarehouseId(), detail.getItemType(), detail.getItemId(), detail.getQuantity(), true, detail.getUnit()); } else { throw new RuntimeException("未知的出入库类型"); } @@ -212,18 +228,19 @@ public class WmsStockIoServiceImpl implements IWmsStockIoService { String ioType = stockIo.getIoType(); if ("in".equals(ioType)) { // 入库撤销:目标库位库存减少 - changeStock(detail.getWarehouseId(), detail.getItemType(), detail.getItemId(), detail.getBatchNo(), detail.getQuantity(), false, detail.getUnit()); +// changeStock(detail.getWarehouseId(), detail.getItemType(), detail.getItemId(), detail.getBatchNo(), detail.getQuantity(), false, detail.getUnit()); + changeStock(detail.getWarehouseId(), detail.getItemType(), detail.getItemId(), detail.getQuantity(), false, detail.getUnit()); } else if ("out".equals(ioType)) { // 出库撤销:目标库位库存增加 - changeStock(detail.getWarehouseId(), detail.getItemType(), detail.getItemId(), detail.getBatchNo(), detail.getQuantity(), true, detail.getUnit()); + changeStock(detail.getWarehouseId(), detail.getItemType(), detail.getItemId(), detail.getQuantity(), true, detail.getUnit()); } else if ("transfer".equals(ioType)) { if (detail.getFromWarehouseId() == null) { throw new ServiceException("移库明细缺少源库位ID"); } // 源库位库存增加 - changeStock(detail.getFromWarehouseId(), detail.getItemType(), detail.getItemId(), detail.getBatchNo(), detail.getQuantity(), true, detail.getUnit()); + changeStock(detail.getFromWarehouseId(), detail.getItemType(), detail.getItemId(), detail.getQuantity(), true, detail.getUnit()); // 目标库位库存减少 - changeStock(detail.getWarehouseId(), detail.getItemType(), detail.getItemId(), detail.getBatchNo(), detail.getQuantity(), false, detail.getUnit()); + changeStock(detail.getWarehouseId(), detail.getItemType(), detail.getItemId(), detail.getQuantity(), false, detail.getUnit()); } else { throw new ServiceException("未知的出入库类型"); } @@ -294,12 +311,12 @@ public class WmsStockIoServiceImpl implements IWmsStockIoService { /** * 库存增减,isAdd=true为增加,false为减少,减少时校验库存是否足够 */ - private void changeStock(Long warehouseId, String itemType, Long itemId, String batchNo, BigDecimal quantity, boolean isAdd, String unit) { + private void changeStock(Long warehouseId, String itemType, Long itemId, BigDecimal quantity, boolean isAdd, String unit) { WmsStock stock = stockMapper.selectOne(Wrappers.lambdaQuery() .eq(WmsStock::getWarehouseId, warehouseId) .eq(WmsStock::getItemType, itemType) .eq(WmsStock::getItemId, itemId) - .eq(WmsStock::getBatchNo, batchNo) +// .eq(WmsStock::getBatchNo, batchNo) .last("limit 1")); if (stock == null) { if (!isAdd) { @@ -310,7 +327,7 @@ public class WmsStockIoServiceImpl implements IWmsStockIoService { stock.setWarehouseId(warehouseId); stock.setItemType(itemType); stock.setItemId(itemId); - stock.setBatchNo(batchNo); + stock.setBatchNo("B-100"); stock.setQuantity(quantity); stock.setUnit(unit); stockMapper.insert(stock);