From 3ca1cefd9bed863131ee3f684ff127bd7ac877aa Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 05 八月 2026 11:35:16 +0800
Subject: [PATCH] feat(ai): 优化AI知识文档处理功能

---
 yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/tender/SrmTenderProjectServiceImpl.java |  106 ++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 101 insertions(+), 5 deletions(-)

diff --git a/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/tender/SrmTenderProjectServiceImpl.java b/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/tender/SrmTenderProjectServiceImpl.java
index 0048d8f..5d1b679 100644
--- a/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/tender/SrmTenderProjectServiceImpl.java
+++ b/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/tender/SrmTenderProjectServiceImpl.java
@@ -4,16 +4,21 @@
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.srm.controller.admin.tender.vo.SrmTenderMaterialSaveReqVO;
 import cn.iocoder.yudao.module.srm.controller.admin.tender.vo.SrmTenderProjectPageReqVO;
+import cn.iocoder.yudao.module.srm.controller.admin.tender.vo.SrmTenderProjectPartialUpdateReqVO;
 import cn.iocoder.yudao.module.srm.controller.admin.tender.vo.SrmTenderProjectSaveReqVO;
 import cn.iocoder.yudao.module.srm.dal.dataobject.SrmBidAwardDO;
 import cn.iocoder.yudao.module.srm.dal.dataobject.SrmTenderMaterialDO;
 import cn.iocoder.yudao.module.srm.dal.dataobject.SrmTenderProjectDO;
 import cn.iocoder.yudao.module.srm.dal.mysql.SrmBidAwardMapper;
+import cn.iocoder.yudao.module.srm.dal.mysql.SrmTenderBidMapper;
 import cn.iocoder.yudao.module.srm.dal.mysql.SrmTenderMaterialMapper;
 import cn.iocoder.yudao.module.srm.dal.mysql.SrmTenderProjectMapper;
+import cn.iocoder.yudao.module.srm.enums.AwardStatusEnum;
 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.validation.annotation.Validated;
@@ -22,6 +27,8 @@
 import java.util.Map;
 import java.util.function.Function;
 import java.util.stream.Collectors;
+
+import static cn.iocoder.yudao.module.srm.enums.LogRecordConstants.*;
 
 @Service
 @Validated
@@ -33,6 +40,8 @@
     private SrmTenderMaterialMapper tenderMaterialMapper;
     @Resource
     private SrmBidAwardMapper bidAwardMapper;
+    @Resource
+    private SrmTenderBidMapper tenderBidMapper;
 
     @Override
     public Long createTenderProject(SrmTenderProjectSaveReqVO createReqVO) {
@@ -43,13 +52,42 @@
     }
 
     @Override
+    @LogRecord(type = LOG_TENDER_TYPE, subType = LOG_TENDER_UPDATE_SUB_TYPE,
+            bizNo = "{{#updateReqVO.id}}", success = LOG_TENDER_UPDATE_SUCCESS)
     public void updateTenderProject(SrmTenderProjectSaveReqVO updateReqVO) {
         SrmTenderProjectDO project = validateTenderExists(updateReqVO.getId());
-        if (!TenderStatusEnum.DRAFT.getCode().equals(project.getTenderStatus())) {
-            throw ServiceExceptionUtil.exception(ErrorCodeConstants.TENDER_STATUS_NOT_DRAFT);
+        Integer status = project.getTenderStatus();
+
+        // 鑽夌鐘舵�侊細鍏ㄥ瓧娈靛彲缂栬緫
+        if (TenderStatusEnum.canEditFullProject(status)) {
+            SrmTenderProjectDO updateObj = BeanUtils.toBean(updateReqVO, SrmTenderProjectDO.class);
+            updateObj.setTenderStatus(status); // 鐘舵�佷笉鍏佽鍓嶇浼犲叆瑕嗙洊
+            tenderProjectMapper.updateById(updateObj);
+            LogRecordContext.putVariable("tenderName", project.getTenderName());
+            LogRecordContext.putVariable("oldTenderDesc", project.getTenderDesc());
+            LogRecordContext.putVariable("newTenderDesc", updateReqVO.getTenderDesc());
+            LogRecordContext.putVariable("oldQualification", project.getQualificationRequirements());
+            LogRecordContext.putVariable("newQualification", updateReqVO.getQualificationRequirements());
+            return;
         }
-        SrmTenderProjectDO updateObj = BeanUtils.toBean(updateReqVO, SrmTenderProjectDO.class);
-        tenderProjectMapper.updateById(updateObj);
+
+        // 鍙戝竷涓�/鎶曟爣涓細浠呭厑璁镐慨鏀规嫑鏍囪鏄庡拰璧勮川瑕佹眰
+        if (TenderStatusEnum.canEditPartialProject(status)) {
+            SrmTenderProjectDO updateObj = new SrmTenderProjectDO();
+            updateObj.setId(updateReqVO.getId());
+            updateObj.setTenderDesc(updateReqVO.getTenderDesc());
+            updateObj.setQualificationRequirements(updateReqVO.getQualificationRequirements());
+            tenderProjectMapper.updateById(updateObj);
+            LogRecordContext.putVariable("tenderName", project.getTenderName());
+            LogRecordContext.putVariable("oldTenderDesc", project.getTenderDesc());
+            LogRecordContext.putVariable("newTenderDesc", updateReqVO.getTenderDesc());
+            LogRecordContext.putVariable("oldQualification", project.getQualificationRequirements());
+            LogRecordContext.putVariable("newQualification", updateReqVO.getQualificationRequirements());
+            return;
+        }
+
+        // 鍏朵粬鐘舵�侊細涓嶅厑璁哥紪杈�
+        throw ServiceExceptionUtil.exception(ErrorCodeConstants.TENDER_PROJECT_LOCKED);
     }
 
     @Override
@@ -58,13 +96,25 @@
         if (!TenderStatusEnum.DRAFT.getCode().equals(project.getTenderStatus())) {
             throw ServiceExceptionUtil.exception(ErrorCodeConstants.TENDER_STATUS_NOT_DRAFT);
         }
+        // 妫�鏌ユ槸鍚﹀凡鏈夋姇鏍囨暟鎹�
+        if (tenderBidMapper.countByTenderProjectId(id) > 0) {
+            throw ServiceExceptionUtil.exception(ErrorCodeConstants.TENDER_HAS_BIDS_CANNOT_DELETE);
+        }
         tenderMaterialMapper.deleteByTenderProjectId(id);
         tenderProjectMapper.deleteById(id);
     }
 
     @Override
     public SrmTenderProjectDO getTenderProject(Long id) {
-        return tenderProjectMapper.selectById(id);
+        SrmTenderProjectDO project = tenderProjectMapper.selectById(id);
+        if (project != null) {
+            SrmBidAwardDO award = bidAwardMapper.selectByTenderProjectId(id);
+            if (award != null) {
+                project.setAwardId(award.getId());
+                project.setPurchaseOrderNo(award.getPurchaseOrderNo());
+            }
+        }
+        return project;
     }
 
     @Override
@@ -82,6 +132,10 @@
                 if (award != null) {
                     project.setAwardId(award.getId());
                     project.setPurchaseOrderNo(award.getPurchaseOrderNo());
+                    // 闃插尽锛氬鏋滃畾鏍囧凡鐢熸垚璁㈠崟浣嗛」鐩姸鎬佹湭鏇存柊锛屽悓姝ョ姸鎬�
+                    if (AwardStatusEnum.ORDER_GENERATED.getCode().equals(award.getAwardStatus())) {
+                        project.setTenderStatus(TenderStatusEnum.CLOSED.getCode());
+                    }
                 }
             });
         }
@@ -103,6 +157,10 @@
         SrmTenderProjectDO project = validateTenderExists(id);
         if (TenderStatusEnum.CLOSED.getCode().equals(project.getTenderStatus())) {
             throw ServiceExceptionUtil.exception(ErrorCodeConstants.TENDER_STATUS_ALREADY_CLOSED);
+        }
+        // 鑽夌鐘舵�佷笉鍏佽鐩存帴鍏抽棴
+        if (TenderStatusEnum.DRAFT.getCode().equals(project.getTenderStatus())) {
+            throw ServiceExceptionUtil.exception(ErrorCodeConstants.TENDER_PROJECT_LOCKED);
         }
         project.setTenderStatus(TenderStatusEnum.CLOSED.getCode());
         tenderProjectMapper.updateById(project);
@@ -128,22 +186,60 @@
         tenderProjectMapper.updateById(project);
     }
 
+    @Override
+    @LogRecord(type = LOG_TENDER_TYPE, subType = LOG_TENDER_UPDATE_SUB_TYPE,
+            bizNo = "{{#updateReqVO.id}}", success = LOG_TENDER_UPDATE_SUCCESS)
+    public void updateTenderProjectPartial(SrmTenderProjectPartialUpdateReqVO updateReqVO) {
+        SrmTenderProjectDO project = validateTenderExists(updateReqVO.getId());
+        if (!TenderStatusEnum.canEditPartialProject(project.getTenderStatus())) {
+            throw ServiceExceptionUtil.exception(ErrorCodeConstants.TENDER_PROJECT_LOCKED);
+        }
+        SrmTenderProjectDO updateObj = new SrmTenderProjectDO();
+        updateObj.setId(updateReqVO.getId());
+        updateObj.setTenderDesc(updateReqVO.getTenderDesc());
+        updateObj.setQualificationRequirements(updateReqVO.getQualificationRequirements());
+        tenderProjectMapper.updateById(updateObj);
+        LogRecordContext.putVariable("tenderName", project.getTenderName());
+        LogRecordContext.putVariable("oldTenderDesc", project.getTenderDesc());
+        LogRecordContext.putVariable("newTenderDesc", updateReqVO.getTenderDesc());
+        LogRecordContext.putVariable("oldQualification", project.getQualificationRequirements());
+        LogRecordContext.putVariable("newQualification", updateReqVO.getQualificationRequirements());
+    }
+
     // ========== 鐗╂枡瀛愯〃 ==========
 
     @Override
     public void createMaterial(SrmTenderMaterialSaveReqVO createReqVO) {
+        SrmTenderProjectDO project = validateTenderExists(createReqVO.getTenderProjectId());
+        if (!TenderStatusEnum.canEditMaterial(project.getTenderStatus())) {
+            throw ServiceExceptionUtil.exception(ErrorCodeConstants.TENDER_MATERIAL_LOCKED);
+        }
         SrmTenderMaterialDO material = BeanUtils.toBean(createReqVO, SrmTenderMaterialDO.class);
         tenderMaterialMapper.insert(material);
     }
 
     @Override
     public void updateMaterial(SrmTenderMaterialSaveReqVO updateReqVO) {
+        SrmTenderMaterialDO existing = tenderMaterialMapper.selectById(updateReqVO.getId());
+        if (existing != null) {
+            SrmTenderProjectDO project = tenderProjectMapper.selectById(existing.getTenderProjectId());
+            if (project != null && !TenderStatusEnum.canEditMaterial(project.getTenderStatus())) {
+                throw ServiceExceptionUtil.exception(ErrorCodeConstants.TENDER_MATERIAL_LOCKED);
+            }
+        }
         SrmTenderMaterialDO updateObj = BeanUtils.toBean(updateReqVO, SrmTenderMaterialDO.class);
         tenderMaterialMapper.updateById(updateObj);
     }
 
     @Override
     public void deleteMaterial(Long id) {
+        SrmTenderMaterialDO material = tenderMaterialMapper.selectById(id);
+        if (material != null) {
+            SrmTenderProjectDO project = tenderProjectMapper.selectById(material.getTenderProjectId());
+            if (project != null && !TenderStatusEnum.canEditMaterial(project.getTenderStatus())) {
+                throw ServiceExceptionUtil.exception(ErrorCodeConstants.TENDER_MATERIAL_LOCKED);
+            }
+        }
         tenderMaterialMapper.deleteById(id);
     }
 

--
Gitblit v1.9.3