From 2eeeb70e4733e7fc41635c3aa2143f13cbc43d58 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期三, 04 十一月 2026 17:11:34 +0800
Subject: [PATCH] feat(erp): 采购来票分摊合计改为不超过来票金额即可
---
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInvoiceServiceImpl.java | 260 ++++++++++++++++++++++++++++++++++++++--------------
1 files changed, 190 insertions(+), 70 deletions(-)
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 19c6e7e..abfd6ff 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
@@ -3,15 +3,22 @@
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.invoice.ErpPurchaseInvoiceOrderReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.invoice.ErpPurchaseInvoicePageReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.invoice.ErpPurchaseInvoiceSaveReqVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInvoiceDO;
+import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInvoiceOrderDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO;
+import cn.iocoder.yudao.module.erp.dal.mysql.finance.ErpFinancePaymentMapper;
import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseInvoiceMapper;
+import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseInvoiceOrderMapper;
import cn.iocoder.yudao.module.erp.dal.redis.no.ErpNoRedisDAO;
-import cn.iocoder.yudao.module.erp.enums.ErpPurchaseInvoiceAuditStatusEnum;
+import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi;
+import cn.iocoder.yudao.module.srm.api.supplier.dto.SrmSupplierRespDTO;
import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
@@ -19,8 +26,16 @@
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
+import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.getSumValue;
@@ -44,10 +59,19 @@
private ErpPurchaseInvoiceMapper invoiceMapper;
@Resource
+ private ErpPurchaseInvoiceOrderMapper invoiceOrderMapper;
+
+ @Resource
+ private ErpFinancePaymentMapper financePaymentMapper;
+
+ @Resource
private ErpNoRedisDAO noRedisDAO;
@Resource
private ErpPurchaseOrderService purchaseOrderService;
+
+ @Resource
+ private SrmSupplierApi srmSupplierApi;
@Resource
private StorageAttachmentApi storageAttachmentApi;
@@ -55,54 +79,132 @@
@Override
@Transactional(rollbackFor = Exception.class)
public Long createPurchaseInvoice(ErpPurchaseInvoiceSaveReqVO createReqVO) {
- // 1.1 鏍¢獙鍏宠仈鏁版嵁瀛樺湪
- validateRelationDataExists(createReqVO);
- // 1.2 鏍¢獙鍙紑绁ㄩ噾棰濊秴杩囦笂闄�
- validatePurchaseInvoicePriceExceedsLimit(createReqVO);
- // 1.3 鐢熸垚鏉ョエ缂栧彿
- String no = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_INVOICE_NO_PREFIX);
+ // 1.1 鏍¢獙閲囪喘璁㈠崟銆佸垎鎽婃槑缁嗭紙鍒嗘憡鍚堣 = 鏉ョエ閲戦锛�
+ List<ErpPurchaseOrderDO> orders = validateOrderAllocations(createReqVO);
+ // 1.2 鏍¢獙姣忓紶璁㈠崟鐨勫垎鎽婇噾棰濅笉瓒呰繃璇ヨ鍗曞墿浣欐湭寮�绁ㄩ噾棰�
+ validateAllocationPriceExceedsLimit(createReqVO, orders);
+ // 1.3 纭畾鏉ョエ缂栧彿锛堝墠绔~鍐欏垯鐢ㄨ嚜瀹氫箟鍗曞彿锛岀暀绌哄垯鑷姩鐢熸垚锛夛紝骞舵牎楠屽敮涓�鎬�
+ String customNo = StrUtil.trim(createReqVO.getNo());
+ String no = StrUtil.isNotBlank(customNo) ? customNo
+ : noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_INVOICE_NO_PREFIX);
if (invoiceMapper.selectByNo(no) != null) {
throw exception(PURCHASE_INVOICE_NO_EXISTS);
}
- // 2.1 鎻掑叆鏉ョエ锛堝垱寤哄悗鍗充负鏈鏍哥姸鎬侊級
- ErpPurchaseInvoiceDO invoice = BeanUtils.toBean(createReqVO, ErpPurchaseInvoiceDO.class)
- .setNo(no).setAuditStatus(ErpPurchaseInvoiceAuditStatusEnum.PROCESS.getStatus());
+ // 2.1 鎻掑叆鏉ョエ锛堝垱寤哄悗鍗充负鏈夋晥鐘舵�侊紝鏃犻渶瀹℃牳锛夛紱涓昏鍗曘�佷緵搴斿晢鍙栧垎鎽婃槑缁嗙涓�寮�
+ ErpPurchaseInvoiceDO invoice = BeanUtils.toBean(createReqVO, ErpPurchaseInvoiceDO.class).setNo(no);
invoiceMapper.insert(invoice);
- // 2.2 缁戝畾鍙戠エ闄勪欢
+ // 2.2 鎻掑叆閲囪喘璁㈠崟鍒嗘憡鏄庣粏
+ insertOrderAllocations(invoice.getId(), createReqVO);
+
+ // 2.3 缁戝畾鍙戠エ闄勪欢
if (CollUtil.isNotEmpty(createReqVO.getBlobIds())) {
storageAttachmentApi.bindAttachments("file", PURCHASE_INVOICE_RECORD_TYPE, invoice.getId(), createReqVO.getBlobIds());
}
return invoice.getId();
}
- private void validateRelationDataExists(ErpPurchaseInvoiceSaveReqVO reqVO) {
- // 鏍¢獙閲囪喘璁㈠崟锛屽繀椤诲鏍搁�氳繃
- ErpPurchaseOrderDO purchaseOrder = purchaseOrderService.validatePurchaseOrder(reqVO.getPurchaseOrderId());
- // 鏍¢獙渚涘簲鍟嗕笌閲囪喘璁㈠崟涓�鑷达紙闃插尽鑴忔暟鎹細鏉ョエ蹇呴』灞炰簬璇ラ噰璐鍗曠殑渚涘簲鍟嗭級
- if (reqVO.getSupplierId() != null && ObjectUtil.notEqual(purchaseOrder.getSupplierId(), reqVO.getSupplierId())) {
- throw exception(PURCHASE_INVOICE_CREATE_FAIL_SUPPLIER_MISMATCH);
+ /**
+ * 鏍¢獙閲囪喘璁㈠崟鍒嗘憡鏄庣粏锛屽苟鎶婁富璁㈠崟銆佷緵搴斿晢鍥炲啓鍒� reqVO 涓�
+ *
+ * @return 鍒嗘憡鏄庣粏涓殑閲囪喘璁㈠崟鍒楄〃锛堥『搴忎笌鏄庣粏涓�鑷达級
+ */
+ private List<ErpPurchaseOrderDO> validateOrderAllocations(ErpPurchaseInvoiceSaveReqVO reqVO) {
+ List<ErpPurchaseInvoiceOrderReqVO> allocations = reqVO.getOrderAllocations();
+ if (CollUtil.isEmpty(allocations)) {
+ throw exception(PURCHASE_INVOICE_ALLOCATION_EMPTY);
}
- reqVO.setSupplierId(purchaseOrder.getSupplierId()); // 渚涘簲鍟嗕互閲囪喘璁㈠崟涓哄噯
+ // 1. 鏍¢獙璁㈠崟涓嶉噸澶嶃�佸繀椤诲鏍搁�氳繃
+ Set<Long> orderIds = new HashSet<>();
+ List<ErpPurchaseOrderDO> orders = new ArrayList<>();
+ for (int i = 0; i < allocations.size(); i++) {
+ ErpPurchaseInvoiceOrderReqVO allocation = allocations.get(i);
+ if (!orderIds.add(allocation.getPurchaseOrderId())) {
+ throw new ServiceException(PURCHASE_INVOICE_ALLOCATION_ORDER_DUPLICATE.getCode(),
+ StrUtil.format("绗� {} 琛岀殑閲囪喘璁㈠崟閲嶅閫夋嫨锛屽悓涓�寮犳潵绁ㄥ唴姣忓紶閲囪喘璁㈠崟鍙兘鍑虹幇涓�娆★紝璇峰垹闄ら噸澶嶈鍚庨噸璇�", i + 1));
+ }
+ if (allocation.getPrice() == null || allocation.getPrice().compareTo(BigDecimal.ZERO) < 0) {
+ throw new ServiceException(PURCHASE_INVOICE_ALLOCATION_PRICE_INVALID.getCode(),
+ StrUtil.format("绗� {} 琛岀殑鍒嗘憡閲戦涓嶈兘涓虹┖涓斾笉鑳藉皬浜� 0锛岃濉啓璇ヨ鍗曟湰娆″垎鎽婂埌鐨勬潵绁ㄩ噾棰�", i + 1));
+ }
+ orders.add(purchaseOrderService.validatePurchaseOrder(allocation.getPurchaseOrderId()));
+ }
+ // 1.2 鏍¢獙鎵�鏈夐噰璐鍗曞繀椤绘槸鍚屼竴渚涘簲鍟嗭紙鏉ョエ瀵瑰簲涓�涓緵搴斿晢锛�
+ validateSameSupplier(orders);
+ // 2. 鏍¢獙鍒嗘憡鍚堣涓嶈兘澶т簬鏉ョエ閲戦锛堝厑璁稿皬浜庯細鏈垎鎽婇儴鍒嗗彲鍚庣画缂栬緫鏉ョエ鏃跺啀琛ュ厖閲囪喘璁㈠崟锛�
+ BigDecimal allocationTotal = allocations.stream().map(ErpPurchaseInvoiceOrderReqVO::getPrice)
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
+ if (allocationTotal.compareTo(reqVO.getPrice()) > 0) {
+ throw new ServiceException(PURCHASE_INVOICE_ALLOCATION_SUM_MISMATCH.getCode(),
+ StrUtil.format("鏉ョエ閲戦 {} 鍏冿紝鍚勮鍗曞垎鎽婂悎璁� {} 鍏冿紝鍒嗘憡鍚堣涓嶈兘澶т簬鏉ョエ閲戦锛堣秴鍑� {} 鍏冿級銆�"
+ + "璇峰噺灏戣鍗曠殑鍒嗘憡閲戦锛屾垨鎻愰珮鏉ョエ閲戦鍚庨噸璇曪紱鏈垎鎽婄殑閮ㄥ垎鍙互鐣欏緟浠ュ悗鍐嶇紪杈戞潵绁ㄨˉ鍏呴噰璐鍗曘��",
+ reqVO.getPrice().stripTrailingZeros().toPlainString(),
+ allocationTotal.stripTrailingZeros().toPlainString(),
+ allocationTotal.subtract(reqVO.getPrice()).stripTrailingZeros().toPlainString()));
+ }
+ // 3. 涓昏鍗曘�佷緵搴斿晢鍙栧垎鎽婃槑缁嗙涓�寮狅紙涓�寮犳潵绁ㄦ秹鍙婂涓緵搴斿晢鏃讹紝鍒楄〃/浠樻娌跨敤绗竴瀹讹級
+ reqVO.setPurchaseOrderId(allocations.get(0).getPurchaseOrderId());
+ reqVO.setSupplierId(orders.get(0).getSupplierId());
+ return orders;
}
- private void validatePurchaseInvoicePriceExceedsLimit(ErpPurchaseInvoiceSaveReqVO reqVO) {
- // 1. 璁$畻鍓╀綑鍙紑绁ㄩ噾棰濓紝涓嶅寘鎷� reqVO 鑷韩锛堝鎵逛腑涔熷崰鐢ㄩ搴︼紝闃叉绱鏉ョエ瓒呰繃閲囪喘璁㈠崟閲戦锛�
- ErpPurchaseOrderDO purchaseOrder = purchaseOrderService.getPurchaseOrder(reqVO.getPurchaseOrderId());
- List<ErpPurchaseInvoiceDO> invoices = invoiceMapper.selectListByOrderIdAndStatus(reqVO.getPurchaseOrderId(),
- List.of(ErpPurchaseInvoiceAuditStatusEnum.DRAFT.getStatus(),
- ErpPurchaseInvoiceAuditStatusEnum.PROCESS.getStatus(),
- ErpPurchaseInvoiceAuditStatusEnum.APPROVE.getStatus()));
- if (reqVO.getId() != null) {
- invoices.removeIf(invoice -> ObjectUtil.equal(invoice.getId(), reqVO.getId()));
+ /**
+ * 鏍¢獙鍒嗘憡鏄庣粏涓殑閲囪喘璁㈠崟鏄惁灞炰簬鍚屼竴渚涘簲鍟嗭細鏉ョエ鍙兘瀵瑰簲涓�涓緵搴斿晢
+ */
+ private void validateSameSupplier(List<ErpPurchaseOrderDO> orders) {
+ ErpPurchaseOrderDO firstOrder = orders.get(0);
+ for (int i = 1; i < orders.size(); i++) {
+ ErpPurchaseOrderDO order = orders.get(i);
+ if (ObjectUtil.notEqual(order.getSupplierId(), firstOrder.getSupplierId())) {
+ throw new ServiceException(PURCHASE_INVOICE_ALLOCATION_SUPPLIER_MISMATCH.getCode(),
+ StrUtil.format("绗� {} 琛岀殑閲囪喘璁㈠崟[{}]渚涘簲鍟嗕负[{}]锛屼笌绗� 1 琛岄噰璐鍗昜{}]鐨勪緵搴斿晢[{}]涓嶄竴鑷淬��"
+ + "涓�寮犳潵绁ㄥ彧鑳藉叧鑱斿悓涓�渚涘簲鍟嗙殑閲囪喘璁㈠崟锛岃绉婚櫎璇ヨ鍗曪紝鎴栨敼閫夎渚涘簲鍟嗙殑鍏朵粬閲囪喘璁㈠崟鍚庨噸璇曘��",
+ i + 1, order.getNo(), getSupplierName(order.getSupplierId()),
+ firstOrder.getNo(), getSupplierName(firstOrder.getSupplierId())));
+ }
}
- BigDecimal remainPrice = purchaseOrder.getTotalPrice().subtract(
- getSumValue(invoices, ErpPurchaseInvoiceDO::getPrice, BigDecimal::add, BigDecimal.ZERO));
- // 2. 鏍¢獙閲戦鏄惁瓒呰繃
- if (reqVO.getPrice().compareTo(remainPrice) > 0) {
- throw exception(PURCHASE_INVOICE_CREATE_FAIL_PRICE_EXCEEDS_LIMIT, remainPrice);
+ }
+
+ private String getSupplierName(Long supplierId) {
+ SrmSupplierRespDTO supplier = srmSupplierApi.getSupplier(supplierId).getCheckedData();
+ return supplier == null ? "ID=" + supplierId : supplier.getName();
+ }
+
+ private void validateAllocationPriceExceedsLimit(ErpPurchaseInvoiceSaveReqVO reqVO, List<ErpPurchaseOrderDO> orders) {
+ List<ErpPurchaseInvoiceOrderReqVO> allocations = reqVO.getOrderAllocations();
+ for (int i = 0; i < allocations.size(); i++) {
+ ErpPurchaseInvoiceOrderReqVO allocation = allocations.get(i);
+ ErpPurchaseOrderDO order = orders.get(i);
+ // 1. 璇ヨ鍗曞叾浠栨潵绁ㄥ凡鍗犵敤鐨勯噾棰濓紙缂栬緫鏃舵帓闄ゆ湰寮犳潵绁ㄨ嚜韬殑鍒嗘憡锛�
+ List<ErpPurchaseInvoiceOrderDO> existed = invoiceOrderMapper.selectListByPurchaseOrderId(order.getId());
+ if (reqVO.getId() != null) {
+ existed.removeIf(row -> ObjectUtil.equal(row.getInvoiceId(), reqVO.getId()));
+ }
+ BigDecimal invoicedPrice = getSumValue(existed, ErpPurchaseInvoiceOrderDO::getPrice, BigDecimal::add, BigDecimal.ZERO);
+ BigDecimal remainPrice = order.getTotalPrice().subtract(invoicedPrice);
+ // 2. 鏍¢獙閲戦鏄惁瓒呰繃
+ if (allocation.getPrice().compareTo(remainPrice) > 0) {
+ throw new ServiceException(PURCHASE_INVOICE_CREATE_FAIL_PRICE_EXCEEDS_LIMIT.getCode(),
+ StrUtil.format("閲囪喘璁㈠崟[{}]鐨勫垎鎽婇噾棰濊秴鍑鸿璁㈠崟鏈紑绁ㄩ噾棰濓細璁㈠崟閲戦 {} 鍏冿紝鍏朵粬鏉ョエ宸插崰鐢� {} 鍏冿紝"
+ + "鍓╀綑鏈紑绁� {} 鍏冿紝鏈鍒嗘憡 {} 鍏冦�傝璋冩暣璇ヨ鍗曠殑鍒嗘憡閲戦锛屾垨鏀归�夊叾浠栭噰璐鍗曞悗閲嶈瘯銆�",
+ order.getNo(), order.getTotalPrice().stripTrailingZeros().toPlainString(),
+ invoicedPrice.stripTrailingZeros().toPlainString(),
+ remainPrice.stripTrailingZeros().toPlainString(),
+ allocation.getPrice().stripTrailingZeros().toPlainString()));
+ }
}
+ }
+
+ private void insertOrderAllocations(Long invoiceId, ErpPurchaseInvoiceSaveReqVO reqVO) {
+ List<ErpPurchaseInvoiceOrderDO> rows = new ArrayList<>();
+ for (int i = 0; i < reqVO.getOrderAllocations().size(); i++) {
+ ErpPurchaseInvoiceOrderReqVO allocation = reqVO.getOrderAllocations().get(i);
+ rows.add(ErpPurchaseInvoiceOrderDO.builder().invoiceId(invoiceId)
+ .purchaseOrderId(allocation.getPurchaseOrderId())
+ .price(allocation.getPrice()).sort(i).build());
+ }
+ rows.forEach(invoiceOrderMapper::insert);
}
@Override
@@ -110,20 +212,20 @@
public void updatePurchaseInvoice(ErpPurchaseInvoiceSaveReqVO updateReqVO) {
Assert.notNull(updateReqVO.getId(), "鏉ョエ缂栧彿涓嶈兘涓虹┖");
// 1.1 鏍¢獙瀛樺湪
- ErpPurchaseInvoiceDO oldInvoice = validatePurchaseInvoiceExists(updateReqVO.getId());
- // 1.2 鍙湁鏈鏍稿彲浠ョ紪杈�
- if (ObjectUtil.notEqual(oldInvoice.getAuditStatus(), ErpPurchaseInvoiceAuditStatusEnum.PROCESS.getStatus())) {
- throw exception(PURCHASE_INVOICE_UPDATE_FAIL_EDITING_PROHIBITED, oldInvoice.getNo());
- }
- // 1.3 鏍¢獙鍏宠仈鏁版嵁 + 鍙紑绁ㄩ噾棰�
- validateRelationDataExists(updateReqVO);
- validatePurchaseInvoicePriceExceedsLimit(updateReqVO);
+ validatePurchaseInvoiceExists(updateReqVO.getId());
+ // 1.2 鏍¢獙閲囪喘璁㈠崟銆佸垎鎽婃槑缁嗐�侀噾棰濅笂闄�
+ List<ErpPurchaseOrderDO> orders = validateOrderAllocations(updateReqVO);
+ validateAllocationPriceExceedsLimit(updateReqVO, orders);
// 2. 鏇存柊鏉ョエ
ErpPurchaseInvoiceDO updateObj = BeanUtils.toBean(updateReqVO, ErpPurchaseInvoiceDO.class);
invoiceMapper.updateById(updateObj);
- // 3. 澧為噺鏇存柊鍙戠エ闄勪欢
+ // 3. 閲嶅缓閲囪喘璁㈠崟鍒嗘憡鏄庣粏
+ invoiceOrderMapper.deleteByInvoiceId(updateReqVO.getId());
+ insertOrderAllocations(updateReqVO.getId(), updateReqVO);
+
+ // 4. 澧為噺鏇存柊鍙戠エ闄勪欢
storageAttachmentApi.updateAttachments("file", PURCHASE_INVOICE_RECORD_TYPE, updateReqVO.getId(), updateReqVO.getBlobIds());
}
@@ -131,35 +233,19 @@
@Transactional(rollbackFor = Exception.class)
public void deletePurchaseInvoice(Long id) {
// 1.1 鏍¢獙瀛樺湪
- ErpPurchaseInvoiceDO invoice = validatePurchaseInvoiceExists(id);
- // 1.2 瀹℃壒閫氳繃鏃讹紝涓嶅厑璁稿垹闄�
- if (ObjectUtil.equal(invoice.getAuditStatus(), ErpPurchaseInvoiceAuditStatusEnum.APPROVE.getStatus())) {
- throw exception(PURCHASE_INVOICE_DELETE_FAIL_IS_APPROVE);
+ validatePurchaseInvoiceExists(id);
+ // 1.2 宸叉湁鏈夋晥浠樻鍗曞叧鑱旂殑鏉ョエ锛屼笉鍏佽鍒犻櫎锛堜繚鎸佹潵绁ㄤ笌浠樻鐨勫叧鑱斿畬鏁存�э級
+ Map<Long, BigDecimal> paidMap = financePaymentMapper.selectPaymentPriceMapByInvoiceId(List.of(id));
+ if (paidMap.getOrDefault(id, BigDecimal.ZERO).compareTo(BigDecimal.ZERO) > 0) {
+ throw exception(PURCHASE_INVOICE_DELETE_FAIL_HAS_PAYMENT);
}
// 2.1 鍒犻櫎鍙戠エ闄勪欢
storageAttachmentApi.deleteAttachmentsByRecord(PURCHASE_INVOICE_RECORD_TYPE, id);
// 2.2 鍒犻櫎鏉ョエ
invoiceMapper.deleteById(id);
- }
-
- @Override
- @Transactional(rollbackFor = Exception.class)
- public void updatePurchaseInvoiceStatus(Long id, Integer status) {
- boolean approve = ErpPurchaseInvoiceAuditStatusEnum.APPROVE.getStatus().equals(status);
- // 1.1 鏍¢獙瀛樺湪
- ErpPurchaseInvoiceDO invoice = validatePurchaseInvoiceExists(id);
- // 1.2 鏍¢獙鐘舵��
- if (invoice.getAuditStatus().equals(status)) {
- throw exception(approve ? PURCHASE_INVOICE_APPROVE_FAIL : PURCHASE_INVOICE_PROCESS_FAIL);
- }
-
- // 2. 鏇存柊鐘舵��
- int updateCount = invoiceMapper.updateByIdAndStatus(id, invoice.getAuditStatus(),
- new ErpPurchaseInvoiceDO().setAuditStatus(status));
- if (updateCount == 0) {
- throw exception(approve ? PURCHASE_INVOICE_APPROVE_FAIL : PURCHASE_INVOICE_PROCESS_FAIL);
- }
+ // 2.3 鍒犻櫎閲囪喘璁㈠崟鍒嗘憡鏄庣粏锛堥噴鏀捐鍗曠殑宸叉潵绁ㄩ噾棰濓級
+ invoiceOrderMapper.deleteByInvoiceId(id);
}
private ErpPurchaseInvoiceDO validatePurchaseInvoiceExists(Long id) {
@@ -189,18 +275,52 @@
}
@Override
- public List<ErpPurchaseInvoiceDO> getPurchaseInvoiceListByOrderIdAndStatus(Long orderId, Collection<Integer> auditStatuses) {
- return invoiceMapper.selectListByOrderIdAndStatus(orderId, auditStatuses);
+ public List<ErpPurchaseInvoiceDO> getPurchaseInvoiceListByOrderId(Long orderId) {
+ List<ErpPurchaseInvoiceOrderDO> allocations = invoiceOrderMapper.selectListByPurchaseOrderId(orderId);
+ if (CollUtil.isEmpty(allocations)) {
+ return Collections.emptyList();
+ }
+ return invoiceMapper.selectByIds(convertSet(allocations, ErpPurchaseInvoiceOrderDO::getInvoiceId));
}
@Override
- public List<ErpPurchaseInvoiceDO> getPurchaseInvoiceListBySupplierIdAndStatus(Long supplierId, Collection<Integer> auditStatuses) {
- return invoiceMapper.selectListBySupplierIdAndStatus(supplierId, auditStatuses);
+ public List<ErpPurchaseInvoiceDO> getPurchaseInvoiceListBySupplierId(Long supplierId) {
+ return invoiceMapper.selectListBySupplierId(supplierId);
}
@Override
- public Long getAuditInvoiceCount() {
- return invoiceMapper.selectCountByAudit();
+ public Map<Long, BigDecimal> getPurchaseInvoicePriceSumMapByOrderIds(Collection<Long> orderIds, Long excludeInvoiceId) {
+ if (CollUtil.isEmpty(orderIds)) {
+ return Collections.emptyMap();
+ }
+ List<ErpPurchaseInvoiceOrderDO> allocations = invoiceOrderMapper.selectListByPurchaseOrderIds(orderIds);
+ if (excludeInvoiceId != null) {
+ // 缂栬緫鏉ョエ鏃舵妸鏈紶鏉ョエ宸插垎鎽婄殑閲戦閫�鍥炶鍗�
+ allocations.removeIf(row -> ObjectUtil.equal(row.getInvoiceId(), excludeInvoiceId));
+ }
+ return allocations.stream().collect(Collectors.groupingBy(ErpPurchaseInvoiceOrderDO::getPurchaseOrderId,
+ Collectors.mapping(ErpPurchaseInvoiceOrderDO::getPrice, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
+ }
+
+ @Override
+ public List<ErpPurchaseInvoiceOrderDO> getPurchaseInvoiceOrderListByInvoiceId(Long invoiceId) {
+ return invoiceOrderMapper.selectListByInvoiceId(invoiceId);
+ }
+
+ @Override
+ public List<ErpPurchaseInvoiceOrderDO> getPurchaseInvoiceOrderListByInvoiceIds(Collection<Long> invoiceIds) {
+ if (CollUtil.isEmpty(invoiceIds)) {
+ return Collections.emptyList();
+ }
+ return invoiceOrderMapper.selectListByInvoiceIds(invoiceIds);
+ }
+
+ @Override
+ public List<ErpPurchaseInvoiceOrderDO> getPurchaseInvoiceOrderListByPurchaseOrderIds(Collection<Long> purchaseOrderIds) {
+ if (CollUtil.isEmpty(purchaseOrderIds)) {
+ return Collections.emptyList();
+ }
+ return invoiceOrderMapper.selectListByPurchaseOrderIds(purchaseOrderIds);
}
}
--
Gitblit v1.9.3