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 鐨勮鍗�
+ *
+ * 鐢ㄤ簬"閲囪喘鏉ョエ"鐧昏鏃堕�夋嫨閲囪喘璁㈠崟锛氶噾棰濆凡寮�瀹岋紙鍓╀綑鍙紑绁ㄩ噾棰� <= 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