From dfeb3c104d48d1b8844c9850bf55c924f51e37ef Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 27 Mar 2026 19:57:14 +0800 Subject: [PATCH] ✨ feat(mes): 更新销售出库单状态流转逻辑,添加 OQC 检验支持 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java | 3 ++- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmProductSalesStatusEnum.java | 10 +++++++++- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineServiceImpl.java | 13 ++++++++++++- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesService.java | 13 ++++++++++++- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java | 23 ++++++++++++++++++++++- yudao-module-mes/src/main/resources/mapper/qc/pendinginspect/MesQcPendingInspectMapper.xml | 13 +++++++------ 6 files changed, 64 insertions(+), 11 deletions(-) diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index f9c9d8e..240d47f 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -533,7 +533,8 @@ public interface ErrorCodeConstants { ErrorCode WM_PRODUCT_SALES_CANNOT_SHIPPING = new ErrorCode(1_040_714_006, "当前状态不允许填写运单"); ErrorCode WM_PRODUCT_SALES_CANNOT_FINISH = new ErrorCode(1_040_714_007, "当前状态不允许执行出库"); ErrorCode WM_PRODUCT_SALES_CANNOT_CANCEL = new ErrorCode(1_040_714_008, "当前状态不允许取消"); - ErrorCode WM_PRODUCT_SALES_DETAILS_EMPTY = new ErrorCode(1_040_714_009, "拣货明细不能为空"); + ErrorCode WM_PRODUCT_SALES_CANNOT_CONFIRM = new ErrorCode(1_040_714_009, "当前状态不允许确认检验通过"); + ErrorCode WM_PRODUCT_SALES_DETAILS_EMPTY = new ErrorCode(1_040_714_020, "拣货明细不能为空"); ErrorCode WM_PRODUCT_SALES_DETAIL_QUANTITY_MISMATCH = new ErrorCode(1_040_714_010, "拣货数量与出库数量不匹配"); ErrorCode WM_PRODUCT_SALES_LINE_NOT_EXISTS = new ErrorCode(1_040_714_011, "销售出库单行不存在"); ErrorCode WM_PRODUCT_SALES_DETAIL_NOT_EXISTS = new ErrorCode(1_040_714_012, "销售出库明细不存在"); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmProductSalesStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmProductSalesStatusEnum.java index af2e508..a3b75c9 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmProductSalesStatusEnum.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmProductSalesStatusEnum.java @@ -28,10 +28,18 @@ public enum MesWmProductSalesStatusEnum implements ArrayValuable { */ PREPARE(MesOrderStatusConstants.PREPARE, "草稿"), /** - * 待拣货 + * 待检测(需要 OQC 检验时),对接 qc 模块的 MesQcOqcDO 后续流程 * * 对应方法:{@link MesWmProductSalesService#submitProductSales(Long)} */ + CONFIRMED(MesOrderStatusConstants.CONFIRMED, "待检测"), + /** + * 待拣货 + * + * 对应方法: + * 1. 不需要 OQC 检验时:{@link MesWmProductSalesService#submitProductSales(Long)} + * 2. 或 OQC 检验完成时:{@link MesWmProductSalesService#confirmProductSales(Long)} + */ APPROVING(MesOrderStatusConstants.APPROVING, "待拣货"), /** * 待填写运单 diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineServiceImpl.java index ac14e19..bed160f 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineServiceImpl.java @@ -115,19 +115,30 @@ public class MesWmProductSalesLineServiceImpl implements MesWmProductSalesLineSe productSalesLineMapper.updateById(new MesWmProductSalesLineDO() .setId(id).setOqcId(oqcId).setQualityStatus(qualityStatus)); - // 2. 检查同一出库单下所有需要 OQC 检验的行的质检状态,联动更新出库单整体状态 + // 2. 检查同一出库单下所有需要 OQC 检验的行 MesWmProductSalesLineDO currentLine = productSalesLineMapper.selectById(id); if (currentLine == null || currentLine.getSalesId() == null) { return; } Long salesId = currentLine.getSalesId(); List allLines = productSalesLineMapper.selectListBySalesId(salesId); + + // 2.1 检查是否有不合格行 → 取消出库单 boolean hasNg = CollectionUtils.anyMatch(allLines, line -> Boolean.TRUE.equals(line.getOqcCheckFlag()) && Objects.equals(line.getQualityStatus(), MesWmQualityStatusEnum.FAIL.getStatus())); if (hasNg) { log.info("[updateProductSalesLineWhenOqcFinish][销售出库单({}) 存在质检不合格行,取消出库单]", salesId); productSalesService.cancelProductSales(salesId); + return; + } + + // 2.2 检查是否所有 OQC 行都已完成,自动流转 CONFIRMED → APPROVING + boolean hasUnchecked = CollectionUtils.anyMatch(allLines, + line -> Boolean.TRUE.equals(line.getOqcCheckFlag()) && line.getOqcId() == null); + if (!hasUnchecked) { + log.info("[updateProductSalesLineWhenOqcFinish][销售出库单({}) 所有 OQC 行检验完成,流转到待拣货]", salesId); + productSalesService.confirmProductSales(salesId); } } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesService.java index ce2268a..1abc86d 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesService.java @@ -53,7 +53,11 @@ public interface MesWmProductSalesService { PageResult getProductSalesPage(MesWmProductSalesPageReqVO pageReqVO); /** - * 提交销售出库单(草稿 → 待拣货) + * 提交销售出库单 + *
    + *
  • 有 OQC 检验行:草稿 → 待检测
  • + *
  • 无 OQC 检验行:草稿 → 待拣货
  • + *
* * @param id 编号 */ @@ -95,4 +99,11 @@ public interface MesWmProductSalesService { */ void cancelProductSales(Long id); + /** + * OQC 检验完成后,自动流转(待检测 → 待拣货) + * + * @param id 编号 + */ + void confirmProductSales(Long id); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java index 3695af8..4170e69 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java @@ -117,7 +117,16 @@ public class MesWmProductSalesServiceImpl implements MesWmProductSalesService { throw exception(WM_PRODUCT_SALES_LINES_EMPTY); } - // 提交(草稿 → 待拣货) + // 检查所有行的 oqcCheckFlag:如果有需要 OQC 检验的行,进入待检测状态 + boolean needOqc = CollectionUtils.anyMatch(lines, + line -> Boolean.TRUE.equals(line.getOqcCheckFlag())); + if (needOqc) { + // 需要检验,进入待检测 + productSalesMapper.updateById(new MesWmProductSalesDO() + .setId(id).setStatus(MesWmProductSalesStatusEnum.CONFIRMED.getStatus())); + return; + } + // 不需要检验,直接进入待拣货 productSalesMapper.updateById(new MesWmProductSalesDO() .setId(id).setStatus(MesWmProductSalesStatusEnum.APPROVING.getStatus())); } @@ -215,6 +224,18 @@ public class MesWmProductSalesServiceImpl implements MesWmProductSalesService { .setId(id).setStatus(MesWmProductSalesStatusEnum.CANCELED.getStatus())); } + @Override + public void confirmProductSales(Long id) { + // 校验存在 + 待检测状态 + MesWmProductSalesDO sales = validateProductSalesExists(id); + if (ObjUtil.notEqual(MesWmProductSalesStatusEnum.CONFIRMED.getStatus(), sales.getStatus())) { + throw exception(WM_PRODUCT_SALES_CANNOT_CONFIRM); + } + // OQC 检验完成,流转到待拣货 + productSalesMapper.updateById(new MesWmProductSalesDO() + .setId(id).setStatus(MesWmProductSalesStatusEnum.APPROVING.getStatus())); + } + private MesWmProductSalesDO validateProductSalesExists(Long id) { MesWmProductSalesDO sales = productSalesMapper.selectById(id); if (sales == null) { diff --git a/yudao-module-mes/src/main/resources/mapper/qc/pendinginspect/MesQcPendingInspectMapper.xml b/yudao-module-mes/src/main/resources/mapper/qc/pendinginspect/MesQcPendingInspectMapper.xml index d03e4ff..4aedf74 100644 --- a/yudao-module-mes/src/main/resources/mapper/qc/pendinginspect/MesQcPendingInspectMapper.xml +++ b/yudao-module-mes/src/main/resources/mapper/qc/pendinginspect/MesQcPendingInspectMapper.xml @@ -4,12 +4,12 @@