From 2b8f88856e90e530ddbfce88aea107a0ec894d5d Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 29 七月 2026 13:51:19 +0800
Subject: [PATCH] refactor(storage): 优化附件关联逻辑并增加评标功能

---
 yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java                  |    6 -
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/document/MesPdDocumentServiceImpl.java          |    6 -
 yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/tender/SrmBidAwardServiceImpl.java                 |    5 +
 yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java          |    6 -
 yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/tender/SrmBidEvaluationController.java    |   24 +++++
 yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java        |    6 -
 yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/tender/SrmBidAwardService.java                     |    5 +
 yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/tender/SrmBidAwardController.java         |    7 +
 yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/tender/vo/SrmBidEvaluationRespVO.java     |    3 
 yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/util/storage/StorageFileUtil.java                    |    7 -
 yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/quotation/CrmSaleQuotationServiceImpl.java         |    6 -
 yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpFinancePaymentServiceImpl.java          |    6 -
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmLeaveApplicationServiceImpl.java       |    7 -
 yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/api/storage/StorageAttachmentApiImpl.java            |   16 ++++
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmTransferApplicationServiceImpl.java    |    6 -
 yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpFinanceReceiptServiceImpl.java          |    6 -
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmResignationApplicationServiceImpl.java |    6 -
 yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/tender/SrmTenderBidServiceImpl.java                |    8 +
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceExceptionServiceImpl.java  |    6 -
 yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/tender/SrmTenderBidController.java        |   25 ++++++
 yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/tender/vo/SrmSupplierQuoteRespVO.java     |   12 +++
 yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/api/storage/StorageAttachmentApi.java                |   12 +++
 22 files changed, 127 insertions(+), 64 deletions(-)

diff --git a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/quotation/CrmSaleQuotationServiceImpl.java b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/quotation/CrmSaleQuotationServiceImpl.java
index c7bab33..123f0c4 100644
--- a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/quotation/CrmSaleQuotationServiceImpl.java
+++ b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/quotation/CrmSaleQuotationServiceImpl.java
@@ -128,11 +128,7 @@
         saleQuotationMapper.updateById(updateObj);
         // 2.2 鏇存柊鎶ヤ环鏄庣粏
         updateQuotationProductList(updateReqVO.getId(), quotationProducts);
-        if (updateReqVO.getBlobIds() != null) {
-            storageAttachmentApi.deleteAttachmentsByRecord("crm_sale_quotation", updateReqVO.getId());
-            storageAttachmentApi.bindAttachments("file", "crm_sale_quotation",
-                    updateReqVO.getId(), updateReqVO.getBlobIds());
-        }
+        storageAttachmentApi.updateAttachments("file", "crm_sale_quotation", updateReqVO.getId(), updateReqVO.getBlobIds());
     }
 
     @Override
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 61b2c53..6de468b 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
@@ -125,11 +125,7 @@
         // 2.2 鏇存柊浠樻鍗曢」
         updateFinancePaymentItemList(updateReqVO.getId(), paymentItems);
         // 2.3 鏇存柊闄勪欢
-        if (updateReqVO.getBlobIds() != null) {
-            storageAttachmentApi.deleteAttachmentsByRecord("erp_finance_payment", updateReqVO.getId());
-            storageAttachmentApi.bindAttachments("file", "erp_finance_payment",
-                    updateReqVO.getId(), updateReqVO.getBlobIds());
-        }
+        storageAttachmentApi.updateAttachments("file", "erp_finance_payment", updateReqVO.getId(), updateReqVO.getBlobIds());
     }
 
     private void calculateTotalPrice(ErpFinancePaymentDO payment, List<ErpFinancePaymentItemDO> paymentItems) {
diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpFinanceReceiptServiceImpl.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpFinanceReceiptServiceImpl.java
index 9ed875a..6dfc853 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpFinanceReceiptServiceImpl.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/finance/ErpFinanceReceiptServiceImpl.java
@@ -125,11 +125,7 @@
         // 2.2 鏇存柊鏀舵鍗曢」
         updateFinanceReceiptItemList(updateReqVO.getId(), receiptItems);
         // 2.3 鏇存柊闄勪欢
-        if (updateReqVO.getBlobIds() != null) {
-            storageAttachmentApi.deleteAttachmentsByRecord("erp_finance_receipt", updateReqVO.getId());
-            storageAttachmentApi.bindAttachments("file", "erp_finance_receipt",
-                    updateReqVO.getId(), updateReqVO.getBlobIds());
-        }
+        storageAttachmentApi.updateAttachments("file", "erp_finance_receipt", updateReqVO.getId(), updateReqVO.getBlobIds());
     }
 
     private void calculateTotalPrice(ErpFinanceReceiptDO receipt, List<ErpFinanceReceiptItemDO> receiptItems) {
diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java
index cb939a8..cd140a7 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java
@@ -147,11 +147,7 @@
         // 2.2 鏇存柊璁㈠崟椤�
         updatePurchaseOrderItemList(updateReqVO.getId(), purchaseOrderItems);
         // 2.3 鏇存柊闄勪欢
-        if (updateReqVO.getBlobIds() != null) {
-            storageAttachmentApi.deleteAttachmentsByRecord("erp_purchase_order", updateReqVO.getId());
-            storageAttachmentApi.bindAttachments("file", "erp_purchase_order",
-                    updateReqVO.getId(), updateReqVO.getBlobIds());
-        }
+        storageAttachmentApi.updateAttachments("file", "erp_purchase_order", updateReqVO.getId(), updateReqVO.getBlobIds());
     }
 
     private void calculateTotalPrice(ErpPurchaseOrderDO purchaseOrder, List<ErpPurchaseOrderItemDO> purchaseOrderItems) {
diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java
index 50e8bb6..540aadc 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java
@@ -146,11 +146,7 @@
         updatePurchaseRequestItemList(updateReqVO.getId(), requestItems);
 
         // 6. 鏇存柊闄勪欢
-        if (updateReqVO.getBlobIds() != null) {
-            storageAttachmentApi.deleteAttachmentsByRecord("erp_purchase_request", updateReqVO.getId());
-            storageAttachmentApi.bindAttachments("file", "erp_purchase_request",
-                    updateReqVO.getId(), updateReqVO.getBlobIds());
-        }
+        storageAttachmentApi.updateAttachments("file", "erp_purchase_request", updateReqVO.getId(), updateReqVO.getBlobIds());
     }
 
     private void calculateTotalPrice(ErpPurchaseRequestDO purchaseRequest, List<ErpPurchaseRequestItemDO> requestItems) {
diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java
index 42ab39c..4df83f5 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java
@@ -141,11 +141,7 @@
         // 2.2 鏇存柊璁㈠崟椤�
         updateSaleOrderItemList(updateReqVO.getId(), saleOrderItems);
         // 2.3 鏇存柊闄勪欢
-        if (updateReqVO.getBlobIds() != null) {
-            storageAttachmentApi.deleteAttachmentsByRecord("erp_sale_order", updateReqVO.getId());
-            storageAttachmentApi.bindAttachments("file", "erp_sale_order",
-                    updateReqVO.getId(), updateReqVO.getBlobIds());
-        }
+        storageAttachmentApi.updateAttachments("file", "erp_sale_order", updateReqVO.getId(), updateReqVO.getBlobIds());
     }
 
     private void calculateTotalPrice(ErpSaleOrderDO saleOrder, List<ErpSaleOrderItemDO> saleOrderItems) {
diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmLeaveApplicationServiceImpl.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmLeaveApplicationServiceImpl.java
index bda7f3a..b90db16 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmLeaveApplicationServiceImpl.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmLeaveApplicationServiceImpl.java
@@ -121,12 +121,7 @@
         // 鏇存柊
         HrmLeaveApplicationDO updateObj = BeanUtils.toBean(updateReqVO, HrmLeaveApplicationDO.class);
         leaveApplicationMapper.updateById(updateObj);
-        // 閲嶆柊缁戝畾闄勪欢
-        if (updateReqVO.getBlobIds() != null) {
-            storageAttachmentApi.deleteAttachmentsByRecord("hrm_leave_application", updateReqVO.getId());
-            storageAttachmentApi.bindAttachments("file", "hrm_leave_application",
-                    updateReqVO.getId(), updateReqVO.getBlobIds());
-        }
+        storageAttachmentApi.updateAttachments("file", "hrm_leave_application", updateReqVO.getId(), updateReqVO.getBlobIds());
     }
 
     @Override
diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmResignationApplicationServiceImpl.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmResignationApplicationServiceImpl.java
index ebdd424..63fe622 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmResignationApplicationServiceImpl.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmResignationApplicationServiceImpl.java
@@ -127,11 +127,7 @@
         }
         HrmResignationApplicationDO updateObj = BeanUtils.toBean(updateReqVO, HrmResignationApplicationDO.class);
         resignationApplicationMapper.updateById(updateObj);
-        if (updateReqVO.getBlobIds() != null) {
-            storageAttachmentApi.deleteAttachmentsByRecord("hrm_resignation_application", updateReqVO.getId());
-            storageAttachmentApi.bindAttachments("file", "hrm_resignation_application",
-                    updateReqVO.getId(), updateReqVO.getBlobIds());
-        }
+        storageAttachmentApi.updateAttachments("file", "hrm_resignation_application", updateReqVO.getId(), updateReqVO.getBlobIds());
     }
 
     @Override
diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmTransferApplicationServiceImpl.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmTransferApplicationServiceImpl.java
index be91a86..71d74fe 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmTransferApplicationServiceImpl.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmTransferApplicationServiceImpl.java
@@ -134,11 +134,7 @@
         }
         HrmTransferApplicationDO updateObj = BeanUtils.toBean(updateReqVO, HrmTransferApplicationDO.class);
         transferApplicationMapper.updateById(updateObj);
-        if (updateReqVO.getBlobIds() != null) {
-            storageAttachmentApi.deleteAttachmentsByRecord("hrm_transfer_application", updateReqVO.getId());
-            storageAttachmentApi.bindAttachments("file", "hrm_transfer_application",
-                    updateReqVO.getId(), updateReqVO.getBlobIds());
-        }
+        storageAttachmentApi.updateAttachments("file", "hrm_transfer_application", updateReqVO.getId(), updateReqVO.getBlobIds());
     }
 
     @Override
diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceExceptionServiceImpl.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceExceptionServiceImpl.java
index 0196b9b..61be7ce 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceExceptionServiceImpl.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceExceptionServiceImpl.java
@@ -64,11 +64,7 @@
         validateAttendanceExceptionExists(updateReqVO.getId());
         HrmAttendanceExceptionDO updateObj = BeanUtils.toBean(updateReqVO, HrmAttendanceExceptionDO.class);
         attendanceExceptionMapper.updateById(updateObj);
-        if (updateReqVO.getBlobIds() != null) {
-            storageAttachmentApi.deleteAttachmentsByRecord("hrm_attendance_exception", updateReqVO.getId());
-            storageAttachmentApi.bindAttachments("file", "hrm_attendance_exception",
-                    updateReqVO.getId(), updateReqVO.getBlobIds());
-        }
+        storageAttachmentApi.updateAttachments("file", "hrm_attendance_exception", updateReqVO.getId(), updateReqVO.getBlobIds());
     }
 
     @Override
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/document/MesPdDocumentServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/document/MesPdDocumentServiceImpl.java
index d1d8172..072e5f1 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/document/MesPdDocumentServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/document/MesPdDocumentServiceImpl.java
@@ -55,11 +55,7 @@
         // 鏇存柊
         MesPdDocumentDO updateObj = BeanUtils.toBean(updateReqVO, MesPdDocumentDO.class);
         documentMapper.updateById(updateObj);
-        if (updateReqVO.getBlobIds() != null) {
-            storageAttachmentApi.deleteAttachmentsByRecord("mes_pd_document", updateReqVO.getId());
-            storageAttachmentApi.bindAttachments("file", "mes_pd_document",
-                    updateReqVO.getId(), updateReqVO.getBlobIds());
-        }
+        storageAttachmentApi.updateAttachments("file", "mes_pd_document", updateReqVO.getId(), updateReqVO.getBlobIds());
     }
 
     @Override
diff --git a/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/tender/SrmBidAwardController.java b/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/tender/SrmBidAwardController.java
index 57822ec..9457f46 100644
--- a/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/tender/SrmBidAwardController.java
+++ b/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/tender/SrmBidAwardController.java
@@ -38,6 +38,13 @@
         return success(BeanUtils.toBean(bidAwardService.getAward(id), SrmBidAwardRespVO.class));
     }
 
+    @GetMapping("/get-by-project")
+    @Operation(summary = "鏍规嵁鎷涙爣椤圭洰ID鑾峰彇瀹氭爣璇︽儏")
+    @PreAuthorize("@ss.hasPermission('srm:bid-award:query')")
+    public CommonResult<SrmBidAwardRespVO> getAwardByProject(@RequestParam("tenderProjectId") Long tenderProjectId) {
+        return success(BeanUtils.toBean(bidAwardService.getAwardByProjectId(tenderProjectId), SrmBidAwardRespVO.class));
+    }
+
     @PutMapping("/approve")
     @Operation(summary = "瀹℃壒瀹氭爣")
     @Parameter(name = "id", description = "瀹氭爣ID", required = true)
diff --git a/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/tender/SrmBidEvaluationController.java b/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/tender/SrmBidEvaluationController.java
index 5f6dbba..68e69a5 100644
--- a/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/tender/SrmBidEvaluationController.java
+++ b/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/tender/SrmBidEvaluationController.java
@@ -1,8 +1,11 @@
 package cn.iocoder.yudao.module.srm.controller.admin.tender;
 
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.srm.controller.admin.tender.vo.*;
+import cn.iocoder.yudao.module.srm.dal.dataobject.SrmSupplierDO;
+import cn.iocoder.yudao.module.srm.service.supplier.SrmSupplierService;
 import cn.iocoder.yudao.module.srm.service.tender.SrmBidEvaluationService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -13,6 +16,8 @@
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 
@@ -25,6 +30,9 @@
     @Resource
     private SrmBidEvaluationService bidEvaluationService;
 
+    @Resource
+    private SrmSupplierService supplierService;
+
     @PostMapping("/create")
     @Operation(summary = "鍒涘缓璇勬爣璁板綍")
     @PreAuthorize("@ss.hasPermission('srm:bid-evaluation:create')")
@@ -36,7 +44,21 @@
     @Operation(summary = "鎸夋嫑鏍囬」鐩幏鍙栬瘎鏍囧垪琛�")
     @PreAuthorize("@ss.hasPermission('srm:bid-evaluation:query')")
     public CommonResult<List<SrmBidEvaluationRespVO>> getEvaluationList(@RequestParam("tenderProjectId") Long tenderProjectId) {
-        return success(BeanUtils.toBean(bidEvaluationService.getEvaluationList(tenderProjectId), SrmBidEvaluationRespVO.class));
+        List<SrmBidEvaluationRespVO> list = BeanUtils.toBean(bidEvaluationService.getEvaluationList(tenderProjectId), SrmBidEvaluationRespVO.class);
+        enrichEvaluationSupplierNames(list);
+        return success(list);
+    }
+
+    private void enrichEvaluationSupplierNames(List<SrmBidEvaluationRespVO> list) {
+        if (list == null || list.isEmpty()) return;
+        Set<Long> supplierIds = CollectionUtils.convertSet(list, SrmBidEvaluationRespVO::getSupplierId);
+        Map<Long, SrmSupplierDO> supplierMap = supplierService.getSupplierMap(supplierIds);
+        list.forEach(vo -> {
+            SrmSupplierDO supplier = supplierMap.get(vo.getSupplierId());
+            if (supplier != null) {
+                vo.setSupplierName(supplier.getName());
+            }
+        });
     }
 
     @PutMapping("/calculate-ranking")
diff --git a/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/tender/SrmTenderBidController.java b/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/tender/SrmTenderBidController.java
index 24bdd75..cab0f50 100644
--- a/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/tender/SrmTenderBidController.java
+++ b/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/tender/SrmTenderBidController.java
@@ -5,6 +5,8 @@
 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.module.srm.controller.admin.tender.vo.*;
 import cn.iocoder.yudao.module.srm.dal.dataobject.SrmSupplierDO;
+import cn.iocoder.yudao.module.srm.dal.dataobject.SrmTenderMaterialDO;
+import cn.iocoder.yudao.module.srm.dal.mysql.SrmTenderMaterialMapper;
 import cn.iocoder.yudao.module.srm.service.supplier.SrmSupplierService;
 import cn.iocoder.yudao.module.srm.service.tender.SrmTenderBidService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -33,6 +35,9 @@
 
     @Resource
     private SrmSupplierService supplierService;
+
+    @Resource
+    private SrmTenderMaterialMapper tenderMaterialMapper;
 
     // ========== 鎶曟爣绠$悊 ==========
 
@@ -91,7 +96,25 @@
     @Operation(summary = "鎸夋姇鏍囪幏鍙栨姤浠峰垪琛�")
     @PreAuthorize("@ss.hasPermission('srm:supplier-quote:query')")
     public CommonResult<List<SrmSupplierQuoteRespVO>> getQuoteListByBid(@RequestParam("bidId") Long bidId) {
-        return success(BeanUtils.toBean(tenderBidService.getQuoteList(bidId), SrmSupplierQuoteRespVO.class));
+        List<SrmSupplierQuoteRespVO> list = BeanUtils.toBean(tenderBidService.getQuoteList(bidId), SrmSupplierQuoteRespVO.class);
+        enrichQuoteMaterialInfo(list);
+        return success(list);
+    }
+
+    private void enrichQuoteMaterialInfo(List<SrmSupplierQuoteRespVO> list) {
+        if (list == null || list.isEmpty()) return;
+        Set<Long> materialIds = CollectionUtils.convertSet(list, SrmSupplierQuoteRespVO::getTenderMaterialId);
+        Map<Long, SrmTenderMaterialDO> materialMap = tenderMaterialMapper.selectBatchIds(materialIds).stream()
+                .collect(java.util.stream.Collectors.toMap(SrmTenderMaterialDO::getId, m -> m));
+        list.forEach(vo -> {
+            SrmTenderMaterialDO material = materialMap.get(vo.getTenderMaterialId());
+            if (material != null) {
+                vo.setTenderMaterialCode(material.getProductCode());
+                vo.setTenderMaterialName(material.getProductName());
+                vo.setTenderMaterialSpec(material.getProductSpec());
+                vo.setTenderMaterialUnit(material.getUnit());
+            }
+        });
     }
 
     // ========== 鍏宠仈鏁版嵁濉厖 ==========
diff --git a/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/tender/vo/SrmBidEvaluationRespVO.java b/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/tender/vo/SrmBidEvaluationRespVO.java
index d48fd4a..63e932f 100644
--- a/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/tender/vo/SrmBidEvaluationRespVO.java
+++ b/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/tender/vo/SrmBidEvaluationRespVO.java
@@ -19,6 +19,9 @@
     @Schema(description = "渚涘簲鍟咺D", example = "1")
     private Long supplierId;
 
+    @Schema(description = "渚涘簲鍟嗗悕绉�", example = "鍗庝负鎶�鏈�")
+    private String supplierName;
+
     @Schema(description = "鎶曟爣ID", example = "1")
     private Long bidId;
 
diff --git a/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/tender/vo/SrmSupplierQuoteRespVO.java b/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/tender/vo/SrmSupplierQuoteRespVO.java
index e3b8a5b..b4b81ed 100644
--- a/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/tender/vo/SrmSupplierQuoteRespVO.java
+++ b/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/controller/admin/tender/vo/SrmSupplierQuoteRespVO.java
@@ -25,6 +25,18 @@
     @Schema(description = "鎷涙爣鐗╂枡ID", example = "1")
     private Long tenderMaterialId;
 
+    @Schema(description = "鐗╂枡缂栫爜")
+    private String tenderMaterialCode;
+
+    @Schema(description = "鐗╂枡鍚嶇О")
+    private String tenderMaterialName;
+
+    @Schema(description = "鐗╂枡瑙勬牸")
+    private String tenderMaterialSpec;
+
+    @Schema(description = "鐗╂枡鍗曚綅")
+    private String tenderMaterialUnit;
+
     @Schema(description = "鎶ヤ环浠锋牸", example = "5000")
     private BigDecimal quotePrice;
 
diff --git a/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/tender/SrmBidAwardService.java b/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/tender/SrmBidAwardService.java
index bec384d..e11e855 100644
--- a/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/tender/SrmBidAwardService.java
+++ b/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/tender/SrmBidAwardService.java
@@ -20,6 +20,11 @@
     SrmBidAwardDO getAward(Long id);
 
     /**
+     * 鏍规嵁鎷涙爣椤圭洰ID鑾峰彇瀹氭爣璁板綍
+     */
+    SrmBidAwardDO getAwardByProjectId(Long tenderProjectId);
+
+    /**
      * 瀹℃壒瀹氭爣
      */
     void approveAward(Long id);
diff --git a/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/tender/SrmBidAwardServiceImpl.java b/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/tender/SrmBidAwardServiceImpl.java
index 4ad94a9..c27da39 100644
--- a/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/tender/SrmBidAwardServiceImpl.java
+++ b/yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/tender/SrmBidAwardServiceImpl.java
@@ -84,6 +84,11 @@
     }
 
     @Override
+    public SrmBidAwardDO getAwardByProjectId(Long tenderProjectId) {
+        return bidAwardMapper.selectByTenderProjectId(tenderProjectId);
+    }
+
+    @Override
     @Transactional(rollbackFor = Exception.class)
     public void approveAward(Long id) {
         SrmBidAwardDO award = validateAwardExists(id);
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..6931e61 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
@@ -88,12 +88,15 @@
     @Override
     public Long createQuote(SrmSupplierQuoteSaveReqVO createReqVO) {
         // 鏍¢獙鎶曟爣鐘舵�侊紙鎾ゆ爣鍚庝笉鍏佽鎶ヤ环锛�
-        validateBidNotWithdrawn(createReqVO.getBidId());
+        SrmTenderBidDO bid = validateBidNotWithdrawn(createReqVO.getBidId());
         // 鏍¢獙鍚屼竴鎶曟爣涓嬬墿鏂欎笉鍙噸澶嶆姤浠�
         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();
     }
@@ -128,11 +131,12 @@
         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) {
diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/api/storage/StorageAttachmentApi.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/api/storage/StorageAttachmentApi.java
index 3d26f6e..fcd07e6 100644
--- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/api/storage/StorageAttachmentApi.java
+++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/api/storage/StorageAttachmentApi.java
@@ -8,6 +8,18 @@
 
     void bindAttachments(String application, String recordType, Long recordId, List<Long> blobIds);
 
+    /**
+     * 澧為噺鏇存柊闄勪欢鍏宠仈锛�
+     * - 鏌ヨ鐜版湁闄勪欢锛屽姣旀柊鏃� blobId锛屽彧鍒犻櫎澶氫綑銆佸彧缁戝畾鏂板
+     * - 濡傛灉鏂版棫涓�鑷达紝涓嶅仛浠讳綍鎿嶄綔
+     *
+     * @param application 搴旂敤鐢ㄩ��
+     * @param recordType  涓氬姟璁板綍绫诲瀷
+     * @param recordId    涓氬姟璁板綍 ID
+     * @param newBlobIds  鏂扮殑 blobId 鍒楄〃锛堜负 null 鏃惰烦杩囷紝涓嶅仛浠讳綍鎿嶄綔锛�
+     */
+    void updateAttachments(String application, String recordType, Long recordId, List<Long> newBlobIds);
+
     List<StorageBlobRespDTO> listAttachments(String recordType, Long recordId);
 
     void deleteAttachments(List<Long> attachmentIds);
diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/api/storage/StorageAttachmentApiImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/api/storage/StorageAttachmentApiImpl.java
index 914c89d..919a93a 100644
--- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/api/storage/StorageAttachmentApiImpl.java
+++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/api/storage/StorageAttachmentApiImpl.java
@@ -38,8 +38,24 @@
     }
 
     @Override
+    public void updateAttachments(String application, String recordType, Long recordId, List<Long> newBlobIds) {
+        if (newBlobIds == null) {
+            return;
+        }
+        if (newBlobIds.isEmpty()) {
+            // 娓呯┖鎵�鏈夐檮浠�
+            systemStorageAttachmentService.deleteAttachmentsByApplicationAndRecordTypeAndRecordId(
+                    application != null ? application : "file", recordType, recordId);
+            return;
+        }
+        // 鍏ㄩ噺鏇挎崲锛歜indAttachments 鍐呴儴鍏堝垹鍚庢彃锛岀洿鎺ヤ紶鍏ュ叏閮ㄦ柊 blobId 鍗冲彲
+        bindAttachments(application, recordType, recordId, newBlobIds);
+    }
+
+    @Override
     public List<StorageBlobRespDTO> listAttachments(String recordType, Long recordId) {
         SystemStorageAttachmentListReqVO reqVO = new SystemStorageAttachmentListReqVO();
+        reqVO.setApplication("file");
         reqVO.setRecordType(recordType);
         reqVO.setRecordId(recordId);
         List<SystemStorageBlobRespVO> list = systemStorageAttachmentService.listAttachments(reqVO);
diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/util/storage/StorageFileUtil.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/util/storage/StorageFileUtil.java
index abc79c1..c5ac949 100644
--- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/util/storage/StorageFileUtil.java
+++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/util/storage/StorageFileUtil.java
@@ -104,21 +104,20 @@
             throw new IllegalArgumentException("鍏宠仈璁板綍id涓嶈兘涓虹┖");
         }
 
-        // 鍒犻櫎鏃ч檮浠朵俊鎭�
+        // 鍙垹闄ゆ棫鐨勯檮浠跺叧鑱旇褰曪紝淇濈暀 blob 璁板綍锛堟枃浠舵湰韬笉鍒犻櫎锛�
         if (application == null || application.trim().isEmpty()) {
             for (SystemStorageAttachmentSaveReqVO.BlobItem item : blobItems) {
                 String itemApp = item.getApplication();
                 if (itemApp == null || itemApp.trim().isEmpty()) {
                     throw new IllegalArgumentException("鏂囦欢鐢ㄩ�斾笉鑳戒负绌�");
                 }
-                deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordId(itemApp, recordType.getType(), recordId);
+                storageAttachmentMapper.deleteByApplicationAndRecordTypeAndRecordId(itemApp, recordType.getType(), recordId);
             }
         } else {
-            deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordId(application, recordType.getType(), recordId);
+            storageAttachmentMapper.deleteByApplicationAndRecordTypeAndRecordId(application, recordType.getType(), recordId);
         }
 
         if (CollUtil.isEmpty(blobItems)) {
-            deleteStorageAttachmentsByRecordTypeAndRecordId(recordType.getType(), recordId);
             return;
         }
 

--
Gitblit v1.9.3