From 8168aef3c7557c9e1361892270a1ebe35dbddba5 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 10 十一月 2026 11:42:19 +0800
Subject: [PATCH] refactor(erp): 采购申请与询价比价流程重构

---
 yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpFinancePaymentServiceImpl.java |   87 +++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 83 insertions(+), 4 deletions(-)

diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpFinancePaymentServiceImpl.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpFinancePaymentServiceImpl.java
index 1f9c13c..2721bf2 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpFinancePaymentServiceImpl.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpFinancePaymentServiceImpl.java
@@ -2,8 +2,11 @@
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.erp.api.finance.dto.ErpFinancePaymentRedFlushCreateReqDTO;
 import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
 import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
@@ -20,6 +23,8 @@
 import cn.iocoder.yudao.module.erp.dal.mysql.finance.ErpFinancePaymentMapper;
 import cn.iocoder.yudao.module.erp.dal.redis.no.ErpNoRedisDAO;
 import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus;
+import cn.iocoder.yudao.module.erp.enums.common.ErpBizTypeEnum;
+import cn.iocoder.yudao.module.erp.enums.finance.ErpFinancePaymentSourceTypeEnum;
 import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseInvoiceService;
 import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseInvoiceServiceImpl;
 import cn.iocoder.yudao.module.erp.service.purchase.ErpSupplierService;
@@ -33,6 +38,7 @@
 import org.springframework.validation.annotation.Validated;
 
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
 import java.util.*;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -99,10 +105,8 @@
                 getSumValue(paymentItems, ErpFinancePaymentItemDO::getPaymentPrice, BigDecimal::add, BigDecimal.ZERO)
                         .subtract(createReqVO.getDiscountPrice()), null);
         // 1.7 鐢熸垚浠樻鍗曞彿锛屽苟鏍¢獙鍞竴鎬�
-        String no = noRedisDAO.generate(ErpNoRedisDAO.FINANCE_PAYMENT_NO_PREFIX);
-        if (financePaymentMapper.selectByNo(no) != null) {
-            throw exception(FINANCE_PAYMENT_NO_EXISTS);
-        }
+        String no = noRedisDAO.generate(ErpNoRedisDAO.FINANCE_PAYMENT_NO_PREFIX,
+                candidate -> financePaymentMapper.selectByNo(candidate) != null);
 
         // 2.1 鎻掑叆浠樻鍗�
         ErpFinancePaymentDO payment = BeanUtils.toBean(createReqVO, ErpFinancePaymentDO.class, in -> in
@@ -174,6 +178,16 @@
         }
 
         // 2. 鍒涘缓 BPM 娴佺▼瀹炰緥
+        // 鍏ㄥ眬鍏嶅鎵癸細涓氬姟鏍¢獙閫氳繃鍚庣洿鎺ユ墽琛屽鎵归�氳繃閫昏緫锛屾棤闇�娴佺▼妯″瀷銆�
+        if (processInstanceApi.isGlobalAutoApprove()) {
+            financePaymentMapper.updateById(new ErpFinancePaymentDO()
+                    .setId(id)
+                    .setStatus(ErpAuditStatus.APPROVING.getStatus())
+                    .setProcessInstanceId(""));
+            updateFinancePaymentAuditStatus(id, cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum.APPROVE.getStatus());
+            return;
+        }
+
         String processInstanceId = processInstanceApi.createProcessInstance(userId,
                 new BpmProcessInstanceCreateReqDTO()
                         .setProcessDefinitionKey(processDefinitionKey)
@@ -386,6 +400,71 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Long createRedFlushPayment(ErpFinancePaymentRedFlushCreateReqDTO reqDTO) {
+        // 1.1 鏍¢獙鏉ユ簮鍗曟嵁锛氬啿绾㈠崟蹇呴』鑳借拷婧埌閫�璐у崟
+        if (reqDTO.getSourceId() == null || StrUtil.isBlank(reqDTO.getSourceNo())) {
+            throw exception(FINANCE_PAYMENT_RED_FLUSH_SOURCE_REQUIRED);
+        }
+        // 1.2 鏍¢獙渚涘簲鍟�
+        if (reqDTO.getSupplierId() == null) {
+            throw exception(FINANCE_PAYMENT_RED_FLUSH_SUPPLIER_REQUIRED);
+        }
+        supplierService.validateSupplier(reqDTO.getSupplierId());
+        // 1.3 鏍¢獙閫�娆鹃噾棰�
+        if (reqDTO.getRefundAmount() == null || reqDTO.getRefundAmount().compareTo(BigDecimal.ZERO) <= 0) {
+            throw exception(FINANCE_PAYMENT_RED_FLUSH_AMOUNT_INVALID, reqDTO.getRefundAmount());
+        }
+        // 1.4 鏍¢獙璐㈠姟浜哄憳
+        if (reqDTO.getFinanceUserId() != null) {
+            adminUserApi.validateUser(reqDTO.getFinanceUserId());
+        }
+        // 1.5 骞傜瓑锛氬悓涓�鏉ユ簮閫�璐у崟鍙厑璁哥敓鎴愪竴寮犲啿绾㈠崟
+        ErpFinancePaymentDO existing = financePaymentMapper.selectOne(new LambdaQueryWrapperX<ErpFinancePaymentDO>()
+                .eq(ErpFinancePaymentDO::getSourceType,
+                        ErpFinancePaymentSourceTypeEnum.PURCHASE_RETURN_RED_FLUSH.getType())
+                .eq(ErpFinancePaymentDO::getSourceId, reqDTO.getSourceId()));
+        if (existing != null) {
+            log.info("[createRedFlushPayment][閫�璐у崟({}) 宸插瓨鍦ㄥ啿绾㈠崟({})锛岀洿鎺ュ鐢╙",
+                    reqDTO.getSourceNo(), existing.getNo());
+            return existing.getId();
+        }
+
+        // 2.1 鐢熸垚浠樻鍗曞彿
+        String no = noRedisDAO.generate(ErpNoRedisDAO.FINANCE_PAYMENT_NO_PREFIX,
+                candidate -> financePaymentMapper.selectByNo(candidate) != null);
+        // 2.2 閲戦鎸夎礋鏁板叆璐�
+        BigDecimal negativeAmount = reqDTO.getRefundAmount().negate();
+        ErpFinancePaymentDO payment = new ErpFinancePaymentDO()
+                .setNo(no)
+                .setStatus(ErpAuditStatus.APPROVE.getStatus())
+                .setPaymentTime(LocalDateTime.now())
+                .setFinanceUserId(reqDTO.getFinanceUserId())
+                .setSupplierId(reqDTO.getSupplierId())
+                .setAccountName(reqDTO.getAccountName())
+                .setTotalPrice(negativeAmount)
+                .setDiscountPrice(BigDecimal.ZERO)
+                .setPaymentPrice(negativeAmount)
+                .setRemark(StrUtil.blankToDefault(reqDTO.getRemark(), "閲囪喘閫�璐у啿绾�"))
+                .setSourceType(ErpFinancePaymentSourceTypeEnum.PURCHASE_RETURN_RED_FLUSH.getType())
+                .setSourceId(reqDTO.getSourceId())
+                .setSourceNo(reqDTO.getSourceNo());
+        financePaymentMapper.insert(payment);
+
+        // 3. 鎻掑叆浠樻椤癸紙涓氬姟绫诲瀷锛氶噰璐��璐э級
+        financePaymentItemMapper.insert(new ErpFinancePaymentItemDO()
+                .setPaymentId(payment.getId())
+                .setBizType(ErpBizTypeEnum.PURCHASE_RETURN.getType())
+                .setBizId(reqDTO.getSourceId())
+                .setBizNo(reqDTO.getSourceNo())
+                .setTotalPrice(negativeAmount)
+                .setPaidPrice(BigDecimal.ZERO)
+                .setPaymentPrice(negativeAmount)
+                .setRemark(StrUtil.blankToDefault(reqDTO.getRemark(), "閲囪喘閫�璐у啿绾�")));
+        return payment.getId();
+    }
+
+    @Override
     public ErpFinancePaymentDO getFinancePayment(Long id) {
         return financePaymentMapper.selectById(id);
     }

--
Gitblit v1.9.3