From 0901fb1177935508ed7fcfec56d1ca25abd0007b Mon Sep 17 00:00:00 2001 From: "zangch@mesnac.com" Date: Thu, 28 Aug 2025 17:20:32 +0800 Subject: [PATCH] =?UTF-8?q?feat(wms):=20=E6=96=B0=E5=A2=9E=E9=87=87?= =?UTF-8?q?=E8=B4=AD=E8=AE=A2=E5=8D=95=E7=89=A9=E6=96=99=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=8A=9F=E8=83=BD=E5=B9=B6=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=9B=98=E7=82=B9=E7=9B=B8=E5=85=B3=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 IWmsPurchaseOrderDetailService 中新增 queryListWithInstockedQty 方法,用于查询带已入库数量统计的采购订单物料列表 - 修改 RemoteInventoryCheckServiceImpl 中的 generateOrderCode 方法,根据盘点任务类型生成不同前缀的订单号 - 在 WmsPurchaseOrderController 中为新增采购订单设置默认订单类型 --- .../WmsPurchaseOrderDetailController.java | 1 + .../dromara/wms/domain/WmsPurchaseOrder.java | 5 +- .../wms/domain/bo/WmsInstockDetailBo.java | 13 +++ .../wms/domain/bo/WmsOutstockOrderBo.java | 3 + .../impl/WmsInstockDetailServiceImpl.java | 102 +++++++++++++----- .../WmsPurchaseOrderDetailServiceImpl.java | 1 + .../wms/WmsPurchaseOrderDetailMapper.xml | 13 +-- 7 files changed, 104 insertions(+), 34 deletions(-) diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/controller/WmsPurchaseOrderDetailController.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/controller/WmsPurchaseOrderDetailController.java index 8f73ba2e..c747e74f 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/controller/WmsPurchaseOrderDetailController.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/controller/WmsPurchaseOrderDetailController.java @@ -117,6 +117,7 @@ public class WmsPurchaseOrderDetailController extends BaseController { /** * 查询采购订单-物料列表(带已入库数量统计) + * 已入库数量从WmsInstockRecord(入库记录)中获取,表示已经打印并扫描入库的实际数量 */ @GetMapping("/listWithInstockedQty") public R> listWithInstockedQty(WmsPurchaseOrderDetailBo bo) { diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsPurchaseOrder.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsPurchaseOrder.java index 04989a17..b45cfd72 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsPurchaseOrder.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsPurchaseOrder.java @@ -1,13 +1,10 @@ package org.dromara.wms.domain; -import org.dromara.common.tenant.core.TenantEntity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; -import lombok.EqualsAndHashCode; -import java.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; import java.io.Serial; +import java.util.Date; /** * 采购订单对象 wms_purchase_order diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsInstockDetailBo.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsInstockDetailBo.java index 10fd5bf1..d2cf1a9a 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsInstockDetailBo.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsInstockDetailBo.java @@ -16,6 +16,7 @@ import java.math.BigDecimal; import java.util.Date; import java.util.HashMap; import java.util.Map; +import java.util.List; /** * 入库单-物料业务对象 wms_instock_detail @@ -190,4 +191,16 @@ public class WmsInstockDetailBo{ */ private String inspectionRequest; + /** + * 每包数量列表(当分包数量>1时使用) + */ + @TableField(exist = false) + private List packageQtyList; + + /** + * 分包模式(average:平均分包, custom:自定义每包数量) + */ + @TableField(exist = false) + private String packageMode; + } diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsOutstockOrderBo.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsOutstockOrderBo.java index 727f040a..5df48d6d 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsOutstockOrderBo.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsOutstockOrderBo.java @@ -7,6 +7,7 @@ import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.wms.domain.WmsOutstockOrder; import java.util.Date; +import java.util.List; /** * 出库单业务对象 wms_outstock_order @@ -91,4 +92,6 @@ public class WmsOutstockOrderBo extends BaseEntity { */ private Long customerId; + private List detailList; + } 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 d11b0ce1..4cdc05f0 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 @@ -13,6 +13,7 @@ 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.BaseMaterialInfo; import org.dromara.wms.domain.WmsInstockDetail; import org.dromara.wms.domain.WmsInstockPrint; import org.dromara.wms.domain.bo.BaseMaterialInfoBo; @@ -100,6 +101,9 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService { .select(BaseMaterialCategory::getMaterialCategoryName) .leftJoin(BaseMaterialCategory.class, BaseMaterialCategory::getMaterialCategoryId, WmsInstockDetail::getMaterialCategoryId) + .select(BaseMaterialInfo::getInspectionRequest)//质检要求(0必检,1免检) + .leftJoin(BaseMaterialInfo.class, BaseMaterialInfo::getMaterialId, WmsInstockDetail::getMaterialId) + .eq(StringUtils.isNotBlank(bo.getIsInspection()), WmsInstockDetail::getIsInspection, bo.getIsInspection()) .eq(bo.getInstockQty() != null, WmsInstockDetail::getInstockQty, bo.getInstockQty()) @@ -213,10 +217,9 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService { BigDecimal printed = detail.getPrintedNum() != null ? detail.getPrintedNum() : BigDecimal.ZERO; BigDecimal remaining = detail.getInstockQty().subtract(printed); - if (remaining.compareTo(BigDecimal.ZERO) <= 0) {// 无剩余 + if (remaining.compareTo(BigDecimal.ONE) < 0) {// 剩余数量小于1时无法打印 throw new ServiceException("无剩余数量可打印"); } - int splitInt = bo.getSplitPackageCount() != null ? bo.getSplitPackageCount() : 1; BigDecimal split = BigDecimal.valueOf(splitInt); int copiesInt = bo.getPrintCopies() != null ? bo.getPrintCopies() : 1; @@ -225,30 +228,72 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService { // 获取当前打印序列 Integer printSeq = (int) wmsInstockPrintService.queryPrintNum(bo) + 1; String baseOrder = generateOrder(printSeq); - BigDecimal totalPackaged = BigDecimal.ZERO; - if (splitInt > 1) { - // 分包逻辑 - if (remaining.compareTo(split) < 0 || remaining.remainder(split).compareTo(BigDecimal.ZERO) != 0) {// 无法平均分包 - throw new ServiceException("无法平均分包"); + // 分包逻辑 - 支持平均分包和自定义分包两种模式 + List packageQtyList = bo.getPackageQtyList(); + String packageMode = bo.getPackageMode(); + + // 默认为平均分包模式 + if (packageMode == null) { + packageMode = "average"; } - BigDecimal per = remaining.divide(split, 0, RoundingMode.DOWN); - - for (int i = 1; i <= splitInt; i++) { - String order = baseOrder + "-" + String.format("%03d", i); - String batchCode = bo.getInstockCode() + bo.getMaterialCode() + order; - - WmsInstockPrint print = new WmsInstockPrint(); - BeanUtils.copyProperties(bo, print); - print.setBatchCode(batchCode); - print.setApportionQty(per); - print.setMaterialQty(1L); // 每个包打印1份,使用Long类型 - print.setInboundStatus("0");//入库状态(0-待入库,1-已入库,2-入库中) - - wmsInstockPrintService.insertWmsInstockPrint(print); - - totalPackaged = totalPackaged.add(per); + + if ("custom".equals(packageMode) && packageQtyList != null && packageQtyList.size() == splitInt) { + // 自定义模式:使用用户指定的每包数量 + BigDecimal totalCustomQty = packageQtyList.stream() + .map(BigDecimal::valueOf) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + if (totalCustomQty.compareTo(remaining) > 0) { + throw new ServiceException("每包数量总计不能超过剩余数量"); + } + + for (int i = 1; i <= splitInt; i++) { + String order = baseOrder + String.format("%03d", i); + String batchCode = generateBatchCode(bo, bo.getBatchCode(), order); + + BigDecimal currentPackageQty = BigDecimal.valueOf(packageQtyList.get(i - 1)); + + WmsInstockPrint print = new WmsInstockPrint(); + BeanUtils.copyProperties(bo, print); + print.setBatchCode(batchCode); + print.setApportionQty(currentPackageQty); + print.setMaterialQty(1L); // 每个包打印1份 + print.setInboundStatus("0"); // 入库状态(0-待入库,1-已入库,2-入库中) + + wmsInstockPrintService.insertWmsInstockPrint(print); + + totalPackaged = totalPackaged.add(currentPackageQty); + } + } else { + // 平均分包模式(默认模式)或自定义模式但数据不完整 + if ("average".equals(packageMode) || packageQtyList == null || packageQtyList.size() != splitInt) { + // 使用平均分包逻辑 + if (remaining.compareTo(split) < 0 || remaining.remainder(split).compareTo(BigDecimal.ZERO) != 0) { + throw new ServiceException("无法平均分包,剩余数量不能被平均分配"); + } + BigDecimal per = remaining.divide(split, 0, RoundingMode.DOWN); + + for (int i = 1; i <= splitInt; i++) { + String order = baseOrder + String.format("%03d", i); + String batchCode = generateBatchCode(bo, bo.getBatchCode(), order); + + WmsInstockPrint print = new WmsInstockPrint(); + BeanUtils.copyProperties(bo, print); + print.setBatchCode(batchCode); + print.setApportionQty(per); + print.setMaterialQty(1L); // 每个包打印1份 + print.setInboundStatus("0"); // 入库状态(0-待入库,1-已入库,2-入库中) + + wmsInstockPrintService.insertWmsInstockPrint(print); + + totalPackaged = totalPackaged.add(per); + } + } else { + // 使用自定义数量但数据验证失败 + throw new ServiceException("自定义分包数量数据验证失败"); + } } } else { // 重复打印逻辑(split == 1) @@ -257,7 +302,7 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService { } copies = BigDecimal.valueOf(copiesInt); - String batchCode = bo.getInstockCode() + bo.getMaterialCode() + baseOrder; + String batchCode = generateBatchCode(bo, bo.getBatchCode(), baseOrder); WmsInstockPrint print = new WmsInstockPrint(); BeanUtils.copyProperties(bo, print); @@ -286,6 +331,15 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService { return value.toString(); } + public String generateBatchCode(WmsInstockDetailBo bo, String batchCode, String baseOrder){ + if(StringUtils.isBlank(batchCode)){ + return bo.getInstockCode() + bo.getMaterialCode() + baseOrder; + }else{ + return batchCode + baseOrder; + } + + } + /** * 保存前的数据校验 */ diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsPurchaseOrderDetailServiceImpl.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsPurchaseOrderDetailServiceImpl.java index 14adeef7..f22474d9 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsPurchaseOrderDetailServiceImpl.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsPurchaseOrderDetailServiceImpl.java @@ -167,6 +167,7 @@ public class WmsPurchaseOrderDetailServiceImpl implements IWmsPurchaseOrderDetai /** * 查询采购订单-物料列表(带已入库数量统计) + * 已入库数量从WmsInstockRecord(入库记录)中获取,表示已经打印并扫描入库的实际数量 * * @param bo 查询条件 * @return 采购订单-物料列表 diff --git a/ruoyi-modules/hwmom-wms/src/main/resources/mapper/wms/WmsPurchaseOrderDetailMapper.xml b/ruoyi-modules/hwmom-wms/src/main/resources/mapper/wms/WmsPurchaseOrderDetailMapper.xml index 1355cd28..279ebe41 100644 --- a/ruoyi-modules/hwmom-wms/src/main/resources/mapper/wms/WmsPurchaseOrderDetailMapper.xml +++ b/ruoyi-modules/hwmom-wms/src/main/resources/mapper/wms/WmsPurchaseOrderDetailMapper.xml @@ -4,7 +4,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - +