diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsOutstockRecordBo.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsOutstockRecordBo.java index 4dfd109..aa77f21 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsOutstockRecordBo.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsOutstockRecordBo.java @@ -1,15 +1,13 @@ package org.dromara.wms.domain.bo; import com.baomidou.mybatisplus.annotation.TableField; -import com.ibm.icu.math.BigDecimal; -import org.dromara.wms.domain.WmsOutstockRecord; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import lombok.EqualsAndHashCode; -import jakarta.validation.constraints.*; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.wms.domain.WmsOutstockRecord; + +import java.math.BigDecimal; /** * 出库记录业务对象 wms_outstock_record @@ -71,9 +69,9 @@ public class WmsOutstockRecordBo extends BaseEntity { /** * erp同步数量 */ - private java.math.BigDecimal erpSynchronousQty; + private BigDecimal erpSynchronousQty; - private java.math.BigDecimal returnQty; + private BigDecimal returnQty; private String returnFlag; private String returnLocationCode; diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/IWmsInstockRecordService.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/IWmsInstockRecordService.java index 38d6fe6..7af9b5c 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/IWmsInstockRecordService.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/IWmsInstockRecordService.java @@ -66,4 +66,11 @@ public interface IWmsInstockRecordService { * @return 是否删除成功 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 完成质检通过后更新入库记录和库存 + * @param instockCode 入库单号 + * @return 是否成功 + */ + Boolean completeQualityCheck(String instockCode); } diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/IWmsInventoryService.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/IWmsInventoryService.java index dc80521..08a332a 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/IWmsInventoryService.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/IWmsInventoryService.java @@ -81,4 +81,12 @@ public interface IWmsInventoryService { int deletePlanList(ArrayList ids); TableDataInfo listInventoryAlarm(WmsInventoryBo bo, PageQuery pageQuery); + + /** + * 根据批次码和库位编码查询库存 + * @param batchCode 批次码 + * @param locationCode 库位编码 + * @return 库存VO + */ + WmsInventoryVo queryByBatchAndLocation(String batchCode, String locationCode); } diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockDetailServiceImpl.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockDetailServiceImpl.java index b3bf0d2..ebda341 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockDetailServiceImpl.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockDetailServiceImpl.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.toolkit.JoinWrappers; import com.github.yulichang.wrapper.MPJLambdaWrapper; import lombok.RequiredArgsConstructor; +import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; @@ -197,7 +198,6 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService { @Override @Transactional(rollbackFor = Exception.class) public Boolean updateByBo(WmsInstockDetailBo bo) { - String username = LoginHelper.getUsername(); // 如果 splitPackageCount 为空,执行常规更新 if (bo.getSplitPackageCount() == null) { @@ -208,13 +208,13 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService { // 获取当前明细 WmsInstockDetail detail = baseMapper.selectById(bo.getInstockDetailId()); if (detail == null) { - return false; + throw new ServiceException("入库单-物料不存在"); } BigDecimal printed = detail.getPrintedNum() != null ? detail.getPrintedNum() : BigDecimal.ZERO; BigDecimal remaining = detail.getInstockQty().subtract(printed); - if (remaining.compareTo(BigDecimal.ZERO) <= 0) { - return false; // 无剩余 + if (remaining.compareTo(BigDecimal.ZERO) <= 0) {// 无剩余 + throw new ServiceException("无剩余数量可打印"); } int splitInt = bo.getSplitPackageCount() != null ? bo.getSplitPackageCount() : 1; @@ -230,8 +230,8 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService { if (splitInt > 1) { // 分包逻辑 - if (remaining.compareTo(split) < 0 || remaining.remainder(split).compareTo(BigDecimal.ZERO) != 0) { - return false; // 无法平均分包 + if (remaining.compareTo(split) < 0 || remaining.remainder(split).compareTo(BigDecimal.ZERO) != 0) {// 无法平均分包 + throw new ServiceException("无法平均分包"); } BigDecimal per = remaining.divide(split, 0, RoundingMode.DOWN); @@ -244,7 +244,6 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService { print.setBatchCode(batchCode); print.setApportionQty(per); print.setMaterialQty(1L); // 每个包打印1份,使用Long类型 - print.setCreateBy(username); wmsInstockPrintService.insertWmsInstockPrint(print); @@ -257,15 +256,13 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService { } copies = BigDecimal.valueOf(copiesInt); - String order = baseOrder; - String batchCode = bo.getInstockCode() + bo.getMaterialCode() + order; + String batchCode = bo.getInstockCode() + bo.getMaterialCode() + baseOrder; WmsInstockPrint print = new WmsInstockPrint(); BeanUtils.copyProperties(bo, print); print.setBatchCode(batchCode); print.setApportionQty(remaining); print.setMaterialQty(copies.longValue()); // 转换为Long - print.setCreateBy(username); wmsInstockPrintService.insertWmsInstockPrint(print); diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockRecordServiceImpl.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockRecordServiceImpl.java index 7af311c..bd8fa6c 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockRecordServiceImpl.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockRecordServiceImpl.java @@ -1,27 +1,35 @@ package org.dromara.wms.service.impl; -import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.mybatis.core.page.PageQuery; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.toolkit.JoinWrappers; import com.github.yulichang.wrapper.MPJLambdaWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.wms.domain.BaseMaterialCategory; -import org.dromara.wms.domain.WmsBaseWarehouse; -import org.springframework.stereotype.Service; -import org.dromara.wms.domain.bo.WmsInstockRecordBo; -import org.dromara.wms.domain.vo.WmsInstockRecordVo; import org.dromara.wms.domain.WmsInstockRecord; +import org.dromara.wms.domain.bo.WmsInstockOrderBo; +import org.dromara.wms.domain.bo.WmsInstockPrintBo; +import org.dromara.wms.domain.bo.WmsInstockRecordBo; +import org.dromara.wms.domain.bo.WmsInventoryBo; +import org.dromara.wms.domain.vo.WmsInstockOrderVo; +import org.dromara.wms.domain.vo.WmsInstockPrintVo; +import org.dromara.wms.domain.vo.WmsInstockRecordVo; +import org.dromara.wms.domain.vo.WmsInventoryVo; +import org.dromara.wms.mapper.WmsInstockOrderMapper; import org.dromara.wms.mapper.WmsInstockRecordMapper; -import org.dromara.wms.service.IWmsInstockRecordService; +import org.dromara.wms.service.*; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.Collection; /** * 入库记录Service业务层处理 @@ -34,6 +42,11 @@ import java.util.Collection; public class WmsInstockRecordServiceImpl implements IWmsInstockRecordService { private final WmsInstockRecordMapper baseMapper; + private final IWmsInventoryService inventoryService; + private final IWmsInstockOrderService instockOrderService; + private final WmsInstockOrderMapper instockOrderMapper; + private final IWmsInstockDetailService instockDetailService; + private final IWmsInstockPrintService instockPrintService; /** * 查询入库记录 @@ -149,4 +162,80 @@ public class WmsInstockRecordServiceImpl implements IWmsInstockRecordService { } return baseMapper.deleteByIds(ids) > 0; } + + + /** + * 完成入库质检操作,将指定入库单的物料库存更新到库存表中 + * + * @param instockCode 入库单编号,用于查询对应的入库记录 + * @return Boolean 质检完成操作是否成功执行。如果入库记录不存在则返回false,否则返回true + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean completeQualityCheck(String instockCode) { + // 查询入库单信息 + WmsInstockOrderBo orderBo = new WmsInstockOrderBo(); + orderBo.setInstockCode(instockCode); + List orders = instockOrderService.queryList(orderBo); + if (orders.isEmpty()) { + throw new ServiceException("入库单不存在 " + instockCode); + } + WmsInstockOrderVo order = orders.get(0); + + // 查询入库打印记录(这些是去质检的对象) + WmsInstockPrintBo printBo = new WmsInstockPrintBo(); + printBo.setInstockCode(instockCode); + List prints = instockPrintService.queryList(printBo); + if (prints.isEmpty()) { + throw new ServiceException("无打印记录可质检 " + instockCode); + } + + // 遍历打印记录,生成入库记录并更新库存 + for (WmsInstockPrintVo print : prints) { + // 构造入库记录对象 + WmsInstockRecordBo recordBo = new WmsInstockRecordBo(); + recordBo.setInstockCode(instockCode); + recordBo.setBatchCode(print.getBatchCode()); + + recordBo.setMaterialId(print.getMaterialId()); + recordBo.setWarehouseId(order.getWarehouseId()); + recordBo.setMaterialCode(print.getMaterialCode()); + recordBo.setMaterialName(print.getMaterialName()); + // TODO: 获取库位 +// recordBo.setLocationCode(); + recordBo.setInstockQty(print.getApportionQty().doubleValue()); // Use apportionQty as qualified quantity + recordBo.setMaterialCategoryId(print.getMaterialCategoryId()); + // 设置ERP同步状态为质检通过 + // recordBo.setErpSynchronousStatus("QC_PASSED"); + // recordBo.setErpSynchronousQty(print.getApportionQty().doubleValue()); + + // 插入入库记录 + insertByBo(recordBo); + + // 更新库存信息 + WmsInventoryVo inventoryVo = inventoryService.queryByBatchAndLocation(recordBo.getBatchCode(), recordBo.getLocationCode()); + double qty = recordBo.getInstockQty(); + if (inventoryVo == null) { + // 如果库存记录不存在,则新增一条库存记录 + WmsInventoryBo inventoryBo = new WmsInventoryBo(); + inventoryBo.setBatchCode(recordBo.getBatchCode()); + inventoryBo.setMaterialId(recordBo.getMaterialId()); + inventoryBo.setStoreId(recordBo.getWarehouseId()); + inventoryBo.setLocationCode(recordBo.getLocationCode()); + inventoryBo.setMaterialCategoryId(Long.valueOf(recordBo.getMaterialCategoryId())); + inventoryBo.setInventoryQty(new BigDecimal(qty)); + inventoryBo.setLockState("0");//锁定状态(0未锁定,1锁定) + inventoryBo.setInventoryStatus("1");//库存状态(0库存归0,1正常) + inventoryService.insertByBo(inventoryBo); + } else { + // 如果库存记录存在,则更新库存数量 + WmsInventoryBo update = new WmsInventoryBo(); + update.setInventoryId(inventoryVo.getInventoryId()); + update.setInventoryQty(inventoryVo.getInventoryQty().add(new BigDecimal(qty))); + inventoryService.updateByBo(update); + } + } + return true; + } + } diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInventoryServiceImpl.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInventoryServiceImpl.java index 7b09a6f..67d78c3 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInventoryServiceImpl.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInventoryServiceImpl.java @@ -1,18 +1,19 @@ package org.dromara.wms.service.impl; -import com.github.yulichang.toolkit.JoinWrappers; -import com.github.yulichang.wrapper.MPJLambdaWrapper; -import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.mybatis.core.page.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.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.wms.domain.*; -import org.dromara.wms.domain.bo.WmsConfigurationBo; +import org.dromara.wms.domain.BaseMaterialCategory; +import org.dromara.wms.domain.WmsBaseWarehouse; +import org.dromara.wms.domain.WmsInventory; import org.dromara.wms.domain.bo.WmsInventoryBo; import org.dromara.wms.domain.bo.WmsMoveOrderBo; import org.dromara.wms.domain.vo.WmsInventoryVo; @@ -22,7 +23,6 @@ import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.*; -import java.util.stream.Collectors; /** * 物料库存Service业务层处理 @@ -222,4 +222,22 @@ public class WmsInventoryServiceImpl implements IWmsInventoryService { } return baseMapper.deleteByIds(ids) > 0; } + + + /** + * 根据批次码和库位编码查询库存 + * @param batchCode 批次码 + * @param locationCode 库位编码 + * @return 库存VO + */ + @Override + public WmsInventoryVo queryByBatchAndLocation(String batchCode, String locationCode) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw + .eq(WmsInventory::getBatchCode, batchCode) + .eq(WmsInventory::getLocationCode, locationCode); + return baseMapper.selectVoOne(lqw); + } + + }