gaoluyang
8 天以前 25a40b9c4e6a1b650610b8b13088d486699532ce
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseOrderMapper.java
@@ -59,8 +59,15 @@
        }
        // 可来票登记(剩余可开票金额 > 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)");
            // 编辑来票时(invoiceId 非空)剔除本张来票自身的分摊,相当于把它已分摊的金额退回订单
            String sql = "t.total_price > (SELECT IFNULL(SUM(a.price), 0) FROM erp_purchase_invoice_order a "
                    + "INNER JOIN erp_purchase_invoice i ON i.id = a.invoice_id AND i.deleted = 0 "
                    + "WHERE a.purchase_order_id = t.id AND a.deleted = 0";
            if (reqVO.getInvoiceId() != null) {
                query.apply(sql + " AND a.invoice_id <> {0})", reqVO.getInvoiceId());
            } else {
                query.apply(sql + ")");
            }
        }
        if (reqVO.getProductId() != null) {
            query.leftJoin(ErpPurchaseOrderItemDO.class, ErpPurchaseOrderItemDO::getOrderId, ErpPurchaseOrderDO::getId)
@@ -79,6 +86,15 @@
        return selectOne(ErpPurchaseOrderDO::getNo, no);
    }
    /**
     * 按编号查询并加行锁,用于采购申请审批通过时复用已有订单,避免并发重复占用
     */
    default ErpPurchaseOrderDO selectByIdForUpdate(Long id) {
        return selectOne(new LambdaQueryWrapperX<ErpPurchaseOrderDO>()
                .eq(ErpPurchaseOrderDO::getId, id)
                .last("FOR UPDATE"));
    }
    default ErpPurchaseOrderDO selectByProcessInstanceId(String processInstanceId) {
        return selectOne(ErpPurchaseOrderDO::getProcessInstanceId, processInstanceId);
    }