yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseOrderMapper.java
@@ -30,6 +30,10 @@
                .eqIfPresent(ErpPurchaseOrderDO::getStatus, reqVO.getStatus())
                .likeIfPresent(ErpPurchaseOrderDO::getRemark, reqVO.getRemark())
                .eqIfPresent(ErpPurchaseOrderDO::getCreator, reqVO.getCreator())
                .eqIfPresent(ErpPurchaseOrderDO::getContractId, reqVO.getContractId())
                .eqIfPresent(ErpPurchaseOrderDO::getPaymentMethod, reqVO.getPaymentMethod())
                .likeIfPresent(ErpPurchaseOrderDO::getLogisticsNo, reqVO.getLogisticsNo())
                .eqIfPresent(ErpPurchaseOrderDO::getAbnormalFlag, reqVO.getAbnormalFlag())
                .orderByDesc(ErpPurchaseOrderDO::getId);
        // 入库状态。为什么需要 t. 的原因,是因为联表查询时,需要指定表名,不然会报 in_count 错误
        if (Objects.equals(reqVO.getInStatus(), ErpPurchaseOrderPageReqVO.IN_STATUS_NONE)) {
@@ -57,6 +61,11 @@
            query.eq(ErpPurchaseOrderDO::getStatus, ErpAuditStatus.APPROVE.getStatus())
                    .apply("t.return_count < t.in_count");
        }
        // 可来票登记(剩余可开票金额 > 0):金额已开完的订单不展示
        if (Boolean.TRUE.equals(reqVO.getRemainPriceEnable())) {
            query.apply("t.total_price > (SELECT IFNULL(SUM(i.price), 0) FROM erp_purchase_invoice i "
                    + "WHERE i.purchase_order_id = t.id AND i.deleted = 0)");
        }
        if (reqVO.getProductId() != null) {
            query.leftJoin(ErpPurchaseOrderItemDO.class, ErpPurchaseOrderItemDO::getOrderId, ErpPurchaseOrderDO::getId)
                    .eq(reqVO.getProductId() != null, ErpPurchaseOrderItemDO::getProductId, reqVO.getProductId())
@@ -70,6 +79,16 @@
                .eq(ErpPurchaseOrderDO::getId, id).eq(ErpPurchaseOrderDO::getStatus, status));
    }
    default List<ErpPurchaseOrderDO> selectListByContractId(Long contractId) {
        return selectList(new LambdaQueryWrapperX<ErpPurchaseOrderDO>()
                .eq(ErpPurchaseOrderDO::getContractId, contractId));
    }
    default long selectCountByContractId(Long contractId) {
        return selectCount(new LambdaQueryWrapperX<ErpPurchaseOrderDO>()
                .eq(ErpPurchaseOrderDO::getContractId, contractId));
    }
    default ErpPurchaseOrderDO selectByNo(String no) {
        return selectOne(ErpPurchaseOrderDO::getNo, no);
    }