From 429866e3d0a2eee95916407b2e1dfa7de6f407ea Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期三, 26 八月 2026 17:18:47 +0800
Subject: [PATCH] feat(erp): 采购来票登记过滤已开完票订单

---
 yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/order/ErpPurchaseOrderRespVO.java    |    3 +++
 yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/order/ErpPurchaseOrderPageReqVO.java |    9 +++++++++
 yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/ErpPurchaseOrderController.java         |    9 +++++++++
 yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInvoiceServiceImpl.java               |   12 ++++++++++++
 yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInvoiceService.java                   |    9 +++++++++
 yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseInvoiceMapper.java                  |    6 ++++++
 yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseOrderMapper.java                    |    5 +++++
 7 files changed, 53 insertions(+), 0 deletions(-)

diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/ErpPurchaseOrderController.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/ErpPurchaseOrderController.java
index f779a39..f014f62 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/ErpPurchaseOrderController.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/ErpPurchaseOrderController.java
@@ -17,6 +17,7 @@
 import cn.iocoder.yudao.module.erp.enums.ErpPurchaseOrderSourceTypeEnum;
 import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi;
 import cn.iocoder.yudao.module.srm.api.supplier.dto.SrmSupplierRespDTO;
+import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseInvoiceService;
 import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseOrderService;
 import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
 import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
@@ -56,6 +57,8 @@
 
     @Resource
     private ErpPurchaseOrderService purchaseOrderService;
+    @Resource
+    private ErpPurchaseInvoiceService purchaseInvoiceService;
     @Resource
     private SrmSupplierApi srmSupplierApi;
 
@@ -211,6 +214,9 @@
         // 1.5 鍗曚綅淇℃伅
         Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureMap(
                 convertSet(purchaseOrderItemList, ErpPurchaseOrderItemDO::getProductUnitId));
+        // 1.6 宸叉潵绁ㄩ噾棰濓細鎸夐噰璐鍗曠粺璁★紝鐢ㄤ簬璁$畻鍓╀綑鍙紑绁ㄩ噾棰�
+        Map<Long, BigDecimal> invoicePriceSumMap = purchaseInvoiceService
+                .getPurchaseInvoicePriceSumMapByOrderIds(convertSet(pageResult.getList(), ErpPurchaseOrderDO::getId));
         // 2. 寮�濮嬫嫾鎺�
         return BeanUtils.toBean(pageResult, ErpPurchaseOrderRespVO.class, purchaseOrder -> {
             purchaseOrder.setItems(BeanUtils.toBean(purchaseOrderItemMap.get(purchaseOrder.getId()), ErpPurchaseOrderRespVO.Item.class,
@@ -225,6 +231,9 @@
             MapUtils.findAndThen(userMap, Long.parseLong(purchaseOrder.getCreator()), user -> purchaseOrder.setCreatorName(user.getNickname()));
             purchaseOrder.setSourceTypeName(ErpPurchaseOrderSourceTypeEnum.WORK_ORDER.getType()
                     .equals(purchaseOrder.getSourceType()) ? "鐢熶骇宸ュ崟" : null);
+            // 鍓╀綑鍙紑绁ㄩ噾棰� = 璁㈠崟鎬婚噾棰� - 宸叉潵绁ㄩ噾棰�
+            purchaseOrder.setRemainInvoicePrice(purchaseOrder.getTotalPrice().subtract(
+                    invoicePriceSumMap.getOrDefault(purchaseOrder.getId(), BigDecimal.ZERO)));
         });
     }
 
diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/order/ErpPurchaseOrderPageReqVO.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/order/ErpPurchaseOrderPageReqVO.java
index 8bf70d4..6fead6b 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/order/ErpPurchaseOrderPageReqVO.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/order/ErpPurchaseOrderPageReqVO.java
@@ -77,4 +77,13 @@
     @Schema(description = "鏄惁鍙��璐�", example = "true")
     private Boolean returnEnable;
 
+    /**
+     * 浠呰繑鍥炲墿浣欏彲寮�绁ㄩ噾棰濆ぇ浜� 0 鐨勮鍗�
+     *
+     * 鐢ㄤ簬"閲囪喘鏉ョエ"鐧昏鏃堕�夋嫨閲囪喘璁㈠崟锛氶噾棰濆凡寮�瀹岋紙鍓╀綑鍙紑绁ㄩ噾棰� &lt;= 0锛夌殑璁㈠崟涓嶅睍绀恒��
+     * 鍓╀綑鍙紑绁ㄩ噾棰� = totalPrice - SUM(erp_purchase_invoice.price)
+     */
+    @Schema(description = "鏄惁浠呰繑鍥炲墿浣欏彲寮�绁ㄩ噾棰濆ぇ浜� 0 鐨勮鍗曪紙閲囪喘鏉ョエ鐧昏浣跨敤锛�", example = "true")
+    private Boolean remainPriceEnable;
+
 }
\ No newline at end of file
diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/order/ErpPurchaseOrderRespVO.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/order/ErpPurchaseOrderRespVO.java
index cd3e609..2074b87 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/order/ErpPurchaseOrderRespVO.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/order/ErpPurchaseOrderRespVO.java
@@ -59,6 +59,9 @@
     @Schema(description = "鍚堣绋庨锛屽崟浣嶏細鍏�", requiredMode = Schema.RequiredMode.REQUIRED, example = "7127")
     private BigDecimal totalTaxPrice;
 
+    @Schema(description = "鍓╀綑鍙紑绁ㄩ噾棰濓紙璁㈠崟鎬婚噾棰� - 宸叉潵绁ㄩ噾棰濓級锛屽崟浣嶏細鍏�", example = "100.00")
+    private BigDecimal remainInvoicePrice;
+
     @Schema(description = "浼樻儬鐜囷紝鐧惧垎姣�", requiredMode = Schema.RequiredMode.REQUIRED, example = "99.88")
     private BigDecimal discountPercent;
 
diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseInvoiceMapper.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseInvoiceMapper.java
index e10010c..33bbae2 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseInvoiceMapper.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseInvoiceMapper.java
@@ -7,6 +7,7 @@
 import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInvoiceDO;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -39,4 +40,9 @@
                 .eq(ErpPurchaseInvoiceDO::getSupplierId, supplierId));
     }
 
+    default List<ErpPurchaseInvoiceDO> selectListByOrderIds(Collection<Long> orderIds) {
+        return selectList(new LambdaQueryWrapperX<ErpPurchaseInvoiceDO>()
+                .in(ErpPurchaseInvoiceDO::getPurchaseOrderId, orderIds));
+    }
+
 }
diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseOrderMapper.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseOrderMapper.java
index 1caa99f..9576e9b 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseOrderMapper.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseOrderMapper.java
@@ -57,6 +57,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())
diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInvoiceService.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInvoiceService.java
index 10ec261..b7f95d2 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInvoiceService.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInvoiceService.java
@@ -6,6 +6,7 @@
 import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInvoiceDO;
 import jakarta.validation.Valid;
 
+import java.math.BigDecimal;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -91,4 +92,12 @@
      */
     List<ErpPurchaseInvoiceDO> getPurchaseInvoiceListBySupplierId(Long supplierId);
 
+    /**
+     * 鏍规嵁閲囪喘璁㈠崟缂栧彿鍒楄〃锛岀粺璁℃瘡涓鍗曠殑鏉ョエ閲戦鍚堣锛堢敤浜庤绠楀墿浣欏彲寮�绁ㄩ噾棰濓級
+     *
+     * @param orderIds 閲囪喘璁㈠崟缂栧彿鍒楄〃
+     * @return Map<閲囪喘璁㈠崟缂栧彿, 鏉ョエ閲戦鍚堣>
+     */
+    Map<Long, BigDecimal> getPurchaseInvoicePriceSumMapByOrderIds(Collection<Long> orderIds);
+
 }
diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInvoiceServiceImpl.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInvoiceServiceImpl.java
index ab24aed..727a59c 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInvoiceServiceImpl.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInvoiceServiceImpl.java
@@ -20,8 +20,10 @@
 
 import java.math.BigDecimal;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.getSumValue;
@@ -176,4 +178,14 @@
         return invoiceMapper.selectListBySupplierId(supplierId);
     }
 
+    @Override
+    public Map<Long, BigDecimal> getPurchaseInvoicePriceSumMapByOrderIds(Collection<Long> orderIds) {
+        if (CollUtil.isEmpty(orderIds)) {
+            return Collections.emptyMap();
+        }
+        List<ErpPurchaseInvoiceDO> invoices = invoiceMapper.selectListByOrderIds(orderIds);
+        return invoices.stream().collect(Collectors.groupingBy(ErpPurchaseInvoiceDO::getPurchaseOrderId,
+                Collectors.mapping(ErpPurchaseInvoiceDO::getPrice, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
+    }
+
 }

--
Gitblit v1.9.3