From 8eeaa57003ac24e053a648d695de1b8da2a22763 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期一, 24 八月 2026 10:05:37 +0800
Subject: [PATCH] 投标移除"供应商必须已准入"校验。供应商已停用,无法参与投标。
---
yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/tender/SrmTenderBidServiceImpl.java | 68 +++++++++++++++++++++++++++++-----
1 files changed, 58 insertions(+), 10 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 6931e61..4dd6b76 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
@@ -1,11 +1,14 @@
package cn.iocoder.yudao.module.srm.service.tender;
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.srm.controller.admin.tender.vo.SrmSupplierQuoteSaveReqVO;
import cn.iocoder.yudao.module.srm.controller.admin.tender.vo.SrmTenderBidSaveReqVO;
+import cn.iocoder.yudao.module.srm.dal.dataobject.SrmSupplierDO;
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.mysql.SrmSupplierApplyMapper;
+import cn.iocoder.yudao.module.srm.dal.dataobject.SrmTenderProjectDO;
+import cn.iocoder.yudao.module.srm.dal.mysql.SrmSupplierMapper;
import cn.iocoder.yudao.module.srm.dal.mysql.SrmSupplierQuoteMapper;
import cn.iocoder.yudao.module.srm.dal.mysql.SrmTenderBidMapper;
import cn.iocoder.yudao.module.srm.dal.mysql.SrmTenderProjectMapper;
@@ -13,6 +16,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 +25,8 @@
import java.time.LocalDateTime;
import java.util.List;
+
+import static cn.iocoder.yudao.module.srm.enums.LogRecordConstants.*;
/**
* SRM 鎶曟爣绠$悊 Service 瀹炵幇绫�
@@ -38,18 +45,32 @@
private SrmTenderProjectMapper tenderProjectMapper;
@Resource
- private SrmSupplierApplyMapper supplierApplyMapper;
+ private SrmSupplierMapper supplierMapper;
// ========== 鎶曟爣绠$悊 ==========
@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());
- // 鏍¢獙渚涘簲鍟嗘槸鍚﹀凡閫氳繃鍑嗗叆瀹℃壒
- if (!supplierApplyMapper.existsApprovedBySupplierId(createReqVO.getSupplierId())) {
- throw ServiceExceptionUtil.exception(ErrorCodeConstants.BID_SUPPLIER_NOT_APPROVED);
+ // 鏍¢獙鎷涙爣椤圭洰鐘舵�侊紙PUBLISHED/BIDDING 鎵嶅厑璁告姇鏍囷級
+ SrmTenderProjectDO project = validateTenderStatus(createReqVO.getTenderProjectId());
+ // 妫�鏌ユ姇鏍囨埅姝㈡椂闂�
+ if (project.getEndTime() != null && LocalDateTime.now().isAfter(project.getEndTime())) {
+ throw ServiceExceptionUtil.exception(ErrorCodeConstants.TENDER_END_TIME_PASSED);
+ }
+ // 鏍¢獙鎶曟爣渚涘簲鍟嗗瓨鍦ㄤ笖鏈仠鐢紙鍑嗗叆鐘舵�佷笉闄愬埗鎶曟爣锛屼腑鏍囩敓鎴愰噰璐鍗曟椂鑷姩鍑嗗叆锛�
+ SrmSupplierDO supplier = supplierMapper.selectById(createReqVO.getSupplierId());
+ if (supplier == null) {
+ throw ServiceExceptionUtil.exception(ErrorCodeConstants.SUPPLIER_NOT_EXISTS);
+ }
+ if (CommonStatusEnum.isDisable(supplier.getStatus())) {
+ throw ServiceExceptionUtil.exception(ErrorCodeConstants.SUPPLIER_NOT_ENABLE, supplier.getName());
+ }
+ // 鏍¢獙鎶曟爣缂栧彿鏄惁閲嶅
+ if (tenderBidMapper.existsByBidNo(createReqVO.getBidNo())) {
+ throw ServiceExceptionUtil.exception(ErrorCodeConstants.BID_NO_EXISTS);
}
// 鏍¢獙渚涘簲鍟嗘槸鍚﹀凡鍙備笌鎶曟爣
SrmTenderBidDO existing = tenderBidMapper.selectByTenderAndSupplier(createReqVO.getTenderProjectId(), createReqVO.getSupplierId());
@@ -60,6 +81,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,20 +98,35 @@
@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) {
// 鏍¢獙鎶曟爣鐘舵�侊紙鎾ゆ爣鍚庝笉鍏佽鎶ヤ环锛�
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);
@@ -104,7 +142,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())) {
@@ -139,9 +182,14 @@
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