From 104db2c4423867a7fa4f41343213f45985ae3110 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期三, 19 八月 2026 18:00:35 +0800
Subject: [PATCH] 补充上传资料上传人上传时间文件附件

---
 yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/tender/SrmTenderBidServiceImpl.java |   60 +++++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 53 insertions(+), 7 deletions(-)

diff --git a/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/tender/SrmTenderBidServiceImpl.java b/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/tender/SrmTenderBidServiceImpl.java
index 77b1270..6410946 100644
--- a/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/tender/SrmTenderBidServiceImpl.java
+++ b/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/tender/SrmTenderBidServiceImpl.java
@@ -5,6 +5,7 @@
 import cn.iocoder.yudao.module.srm.controller.admin.tender.vo.SrmTenderBidSaveReqVO;
 import cn.iocoder.yudao.module.srm.dal.dataobject.SrmSupplierQuoteDO;
 import cn.iocoder.yudao.module.srm.dal.dataobject.SrmTenderBidDO;
+import cn.iocoder.yudao.module.srm.dal.dataobject.SrmTenderProjectDO;
 import cn.iocoder.yudao.module.srm.dal.mysql.SrmSupplierApplyMapper;
 import cn.iocoder.yudao.module.srm.dal.mysql.SrmSupplierQuoteMapper;
 import cn.iocoder.yudao.module.srm.dal.mysql.SrmTenderBidMapper;
@@ -13,6 +14,8 @@
 import cn.iocoder.yudao.module.srm.enums.ErrorCodeConstants;
 import cn.iocoder.yudao.module.srm.enums.TenderStatusEnum;
 import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
+import com.mzt.logapi.context.LogRecordContext;
+import com.mzt.logapi.starter.annotation.LogRecord;
 import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -20,6 +23,8 @@
 
 import java.time.LocalDateTime;
 import java.util.List;
+
+import static cn.iocoder.yudao.module.srm.enums.LogRecordConstants.*;
 
 /**
  * SRM 鎶曟爣绠$悊 Service 瀹炵幇绫�
@@ -44,12 +49,22 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    @LogRecord(type = LOG_BID_TYPE, subType = LOG_BID_CREATE_SUB_TYPE,
+            bizNo = "{{#createReqVO.bidNo}}", success = LOG_BID_CREATE_SUCCESS)
     public Long createBid(SrmTenderBidSaveReqVO createReqVO) {
-        // 鏍¢獙鎷涙爣椤圭洰鏄惁瀛樺湪涓旂姸鎬佹纭�
-        validateTenderStatus(createReqVO.getTenderProjectId());
+        // 鏍¢獙鎷涙爣椤圭洰鐘舵�侊紙PUBLISHED/BIDDING 鎵嶅厑璁告姇鏍囷級
+        SrmTenderProjectDO project = validateTenderStatus(createReqVO.getTenderProjectId());
+        // 妫�鏌ユ姇鏍囨埅姝㈡椂闂�
+        if (project.getEndTime() != null && LocalDateTime.now().isAfter(project.getEndTime())) {
+            throw ServiceExceptionUtil.exception(ErrorCodeConstants.TENDER_END_TIME_PASSED);
+        }
         // 鏍¢獙渚涘簲鍟嗘槸鍚﹀凡閫氳繃鍑嗗叆瀹℃壒
         if (!supplierApplyMapper.existsApprovedBySupplierId(createReqVO.getSupplierId())) {
             throw ServiceExceptionUtil.exception(ErrorCodeConstants.BID_SUPPLIER_NOT_APPROVED);
+        }
+        // 鏍¢獙鎶曟爣缂栧彿鏄惁閲嶅
+        if (tenderBidMapper.existsByBidNo(createReqVO.getBidNo())) {
+            throw ServiceExceptionUtil.exception(ErrorCodeConstants.BID_NO_EXISTS);
         }
         // 鏍¢獙渚涘簲鍟嗘槸鍚﹀凡鍙備笌鎶曟爣
         SrmTenderBidDO existing = tenderBidMapper.selectByTenderAndSupplier(createReqVO.getTenderProjectId(), createReqVO.getSupplierId());
@@ -60,6 +75,8 @@
         bid.setBidStatus(BidStatusEnum.REGISTERED.getCode());
         bid.setBidTime(LocalDateTime.now());
         tenderBidMapper.insert(bid);
+        LogRecordContext.putVariable("bidNo", bid.getBidNo());
+        LogRecordContext.putVariable("tenderName", project.getTenderName());
         return bid.getId();
     }
 
@@ -75,25 +92,43 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    @LogRecord(type = LOG_BID_TYPE, subType = LOG_BID_WITHDRAW_SUB_TYPE,
+            bizNo = "{{#id}}", success = LOG_BID_WITHDRAW_SUCCESS)
     public void withdrawBid(Long id) {
         SrmTenderBidDO bid = validateBidExists(id);
+        // 妫�鏌ユ嫑鏍囬」鐩姸鎬侊細浠� PUBLISHED/BIDDING 鍏佽鎾ゆ爣
+        SrmTenderProjectDO project = tenderProjectMapper.selectById(bid.getTenderProjectId());
+        if (project == null || !TenderStatusEnum.canCreateOrUpdateQuote(project.getTenderStatus())) {
+            throw ServiceExceptionUtil.exception(ErrorCodeConstants.TENDER_BID_FORBIDDEN_WITHDRAW);
+        }
         bid.setBidStatus(BidStatusEnum.WITHDRAWN.getCode());
         tenderBidMapper.updateById(bid);
         // 鍒犻櫎鎶ヤ环
         supplierQuoteMapper.deleteByBidId(id);
+        LogRecordContext.putVariable("bidNo", bid.getBidNo());
     }
 
     // ========== 鎶ヤ环绠$悊 ==========
 
     @Override
+    @LogRecord(type = LOG_QUOTE_TYPE, subType = LOG_QUOTE_CREATE_SUB_TYPE,
+            bizNo = "{{#createReqVO.bidId}}", success = LOG_QUOTE_CREATE_SUCCESS)
     public Long createQuote(SrmSupplierQuoteSaveReqVO createReqVO) {
         // 鏍¢獙鎶曟爣鐘舵�侊紙鎾ゆ爣鍚庝笉鍏佽鎶ヤ环锛�
-        validateBidNotWithdrawn(createReqVO.getBidId());
+        SrmTenderBidDO bid = validateBidNotWithdrawn(createReqVO.getBidId());
+        // 鏍¢獙鎷涙爣椤圭洰鐘舵�侊細浠� PUBLISHED/BIDDING 鍏佽鎶ヤ环
+        SrmTenderProjectDO project = tenderProjectMapper.selectById(bid.getTenderProjectId());
+        if (project == null || !TenderStatusEnum.canCreateOrUpdateQuote(project.getTenderStatus())) {
+            throw ServiceExceptionUtil.exception(ErrorCodeConstants.TENDER_QUOTE_FORBIDDEN);
+        }
         // 鏍¢獙鍚屼竴鎶曟爣涓嬬墿鏂欎笉鍙噸澶嶆姤浠�
         if (supplierQuoteMapper.existsByBidAndMaterial(createReqVO.getBidId(), createReqVO.getTenderMaterialId())) {
             throw ServiceExceptionUtil.exception(ErrorCodeConstants.QUOTE_MATERIAL_DUPLICATE);
         }
         SrmSupplierQuoteDO quote = BeanUtils.toBean(createReqVO, SrmSupplierQuoteDO.class);
+        // 浠庢姇鏍囪褰曚腑鑾峰彇鎷涙爣椤圭洰ID鍜屼緵搴斿晢ID锛岄伩鍏嶅墠绔仐婕忓鑷存暟鎹簱绾︽潫澶辫触
+        quote.setTenderProjectId(bid.getTenderProjectId());
+        quote.setSupplierId(bid.getSupplierId());
         supplierQuoteMapper.insert(quote);
         return quote.getId();
     }
@@ -101,7 +136,12 @@
     @Override
     public void updateQuote(SrmSupplierQuoteSaveReqVO updateReqVO) {
         // 鏍¢獙鎶曟爣鐘舵�侊紙鎾ゆ爣鍚庝笉鍏佽鎶ヤ环锛�
-        validateBidNotWithdrawn(updateReqVO.getBidId());
+        SrmTenderBidDO bid = validateBidNotWithdrawn(updateReqVO.getBidId());
+        // 鏍¢獙鎷涙爣椤圭洰鐘舵�侊細浠� PUBLISHED/BIDDING 鍏佽鎶ヤ环
+        SrmTenderProjectDO project = tenderProjectMapper.selectById(bid.getTenderProjectId());
+        if (project == null || !TenderStatusEnum.canCreateOrUpdateQuote(project.getTenderStatus())) {
+            throw ServiceExceptionUtil.exception(ErrorCodeConstants.TENDER_QUOTE_FORBIDDEN);
+        }
         // 鏍¢獙鍚屼竴鎶曟爣涓嬬墿鏂欎笉鍙噸澶嶆姤浠凤紙鎺掗櫎鑷韩锛�
         SrmSupplierQuoteDO existing = supplierQuoteMapper.selectById(updateReqVO.getId());
         if (existing != null && !existing.getTenderMaterialId().equals(updateReqVO.getTenderMaterialId())) {
@@ -128,16 +168,22 @@
         return bid;
     }
 
-    private void validateBidNotWithdrawn(Long bidId) {
+    private SrmTenderBidDO validateBidNotWithdrawn(Long bidId) {
         SrmTenderBidDO bid = validateBidExists(bidId);
         if (BidStatusEnum.WITHDRAWN.getCode().equals(bid.getBidStatus())) {
             throw ServiceExceptionUtil.exception(ErrorCodeConstants.BID_WITHDRAWN_CANNOT_QUOTE);
         }
+        return bid;
     }
 
-    private void validateTenderStatus(Long tenderProjectId) {
-        if (tenderProjectMapper.selectById(tenderProjectId) == null) {
+    private SrmTenderProjectDO validateTenderStatus(Long tenderProjectId) {
+        SrmTenderProjectDO project = tenderProjectMapper.selectById(tenderProjectId);
+        if (project == null) {
             throw ServiceExceptionUtil.exception(ErrorCodeConstants.TENDER_NOT_EXISTS);
         }
+        if (!TenderStatusEnum.canCreateBid(project.getTenderStatus())) {
+            throw ServiceExceptionUtil.exception(ErrorCodeConstants.TENDER_BID_FORBIDDEN);
+        }
+        return project;
     }
 }

--
Gitblit v1.9.3