yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/workorder/MesProWorkOrderMapper.java
@@ -34,7 +34,10 @@
                .eqIfPresent(MesProWorkOrderDO::getProductId, reqVO.getProductId())
                .eqIfPresent(MesProWorkOrderDO::getClientId, reqVO.getClientId())
                .eqIfPresent(MesProWorkOrderDO::getStatus, reqVO.getStatus())
                .eqIfPresent(MesProWorkOrderDO::getPackingStatus, reqVO.getPackingStatus())
                .betweenIfPresent(MesProWorkOrderDO::getRequestDate, reqVO.getRequestDate())
                .notIn(CollUtil.isNotEmpty(reqVO.getExcludeStatuses()),
                        MesProWorkOrderDO::getStatus, reqVO.getExcludeStatuses())
                .orderByDesc(MesProWorkOrderDO::getId));
    }
@@ -50,8 +53,12 @@
                .eqIfPresent(MesProWorkOrderDO::getProductId, reqVO.getProductId())
                .eqIfPresent(MesProWorkOrderDO::getClientId, reqVO.getClientId())
                .eqIfPresent(MesProWorkOrderDO::getStatus, reqVO.getStatus())
                .eqIfPresent(MesProWorkOrderDO::getPackingStatus, reqVO.getPackingStatus())
                .betweenIfPresent(MesProWorkOrderDO::getRequestDate, reqVO.getRequestDate())
                .orderByDesc(MesProWorkOrderDO::getId);
        if (CollUtil.isNotEmpty(reqVO.getExcludeStatuses())) {
            wrapper.notIn(MesProWorkOrderDO::getStatus, reqVO.getExcludeStatuses());
        }
        if (permittedClientIds != null) {
            if (CollUtil.isEmpty(permittedClientIds)) {
                return PageResult.empty();
@@ -103,4 +110,24 @@
        return selectCount(MesProWorkOrderDO::getVendorId, vendorId);
    }
    /**
     * 累加工单的已装箱数量与已装箱箱数
     */
    default void updatePackedQuantity(Long id, BigDecimal incrQuantity, Integer incrBoxCount) {
        update(null, new LambdaUpdateWrapper<MesProWorkOrderDO>()
                .eq(MesProWorkOrderDO::getId, id)
                .setSql("packed_quantity = IFNULL(packed_quantity, 0) + " + incrQuantity.toPlainString())
                .setSql("packed_box_count = IFNULL(packed_box_count, 0) + " + incrBoxCount));
    }
    /**
     * 根据已装箱数量重算装箱状态:已装 >= 工单数量为完成(2),部分为 1,否则 0
     */
    default void updatePackingStatus(Long id) {
        update(null, new LambdaUpdateWrapper<MesProWorkOrderDO>()
                .eq(MesProWorkOrderDO::getId, id)
                .setSql("packing_status = CASE WHEN IFNULL(packed_quantity, 0) >= IFNULL(quantity, 0) THEN 2 "
                        + "WHEN IFNULL(packed_quantity, 0) > 0 THEN 1 ELSE 0 END"));
    }
}